参考文档:
- 十大经典排序算法(动图演示)
- 基于python的七种经典排序算法
- https://github.com/TheAlgorithms/Python
- https://www.toptal.com/developers/sorting-algorithms
算法概述
算法分类
十种常见排序算法可以分为两大类:
非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
算法复杂度
相关概念
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。
冒泡排序(Bubble sort)
冒泡排序,有时也称为下沉排序,是一种简单的排序算法,它反复遍历要排序的列表,比较每对相邻的项目,如果它们的顺序不满足条件则交换它们。 重复遍历列表,直到不需要交换,这时列表就是已排序的。其核心思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止。
算法描述
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
重复步骤1~3,直到排序完成。
动态演示
代码实现
# -*- 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()
结果: