参考文档:

算法概述

算法分类

十种常见排序算法可以分为两大类:

非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。

排序算法总结——python语言实现

算法复杂度排序算法总结——python语言实现
相关概念

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。

冒泡排序(Bubble sort)

冒泡排序,有时也称为下沉排序,是一种简单的排序算法,它反复遍历要排序的列表,比较每对相邻的项目,如果它们的顺序不满足条件则交换它们。 重复遍历列表,直到不需要交换,这时列表就是已排序的。其核心思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止。

算法描述
  1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  3. 针对所有的元素重复以上的步骤,除了最后一个;
    重复步骤1~3,直到排序完成。
动态演示

排序算法总结——python语言实现

代码实现
# -*- coding: utf-8 -*-
# --------------------------------------
#       @Time    : 2019/1/17 上午10:41
#       @Author  : cxy =.= 
#       @File    : bubble_sort.py
#       @Software: PyCharm
#       @Desc    : 冒泡排序,从小到大排序
# --------------------------------------
import copy
from tool import caculate_time


class BubbleSort(object):
    def __init__(self, li=None):
        self.list = li

    def swap(self, li, i, j):
        """
        交换元素,i,j表示下标
        :param i:
        :param j:
        :return:
        """
        li[i], li[j] = li[j], li[i]

    @caculate_time
    def bubble_sort_simple(self):
        """
        简单冒泡排序,时间复杂度O(n^2)
        :return:
        """
        li = copy.deepcopy(self.list)
        length = len(li)
        for i in range(length):
            for j in range(i + 1, length):
                if li[i] > li[j]:
                    self.swap(li, i, j)
        return li

    @caculate_time
    def bubble_sort(self):
        """
        冒牌排序,时间复杂度O(n^2)
        :return:
        """
        li = copy.deepcopy(self.list)
        length = len(li)
        for i in range(length):
            for j in range(length - 1 - i):
                if li[j] > li[j + 1]:
                    self.swap(li, j, j + 1)
        return li

    @caculate_time
    def bubble_sort_advance(self):
        """
        改进后的冒泡排序,时间复杂度O(n^2)
        设置一个flag,当某一轮没有发生变化时,证明排序已经有序了
        :return:
        """
        li = copy.deepcopy(self.list)
        length = len(li)
        for i in range(length):
            flag = True
            for j in range(length - 1 - i):
                if li[j] > li[j + 1]:
                    self.swap(li, j, j + 1)
                    flag = False
            if flag:
                break
        return li


if __name__ == '__main__':
    li = [4, 1, 7, 3, 8, 5, 9, 2, 6]
    bs = BubbleSort(li)
    bs.bubble_sort_simple()
    bs.bubble_sort()
    bs.bubble_sort_advance()

结果:
排序算法总结——python语言实现

相关文章: