十大排序算法(Python实现)
十种常见排序算法可以分为两大类
非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。执行计算需要消耗的时间长短。
空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。执行计算需要的内存空间
参考:https://blog.youkuaiyun.com/weixin_41571493/article/details/81875088
- 交换排序
1.1 冒泡排序(Bubble Sort)
1.2 快速排序(Quick Sort) - 插入排序
2.1 简单插入排序(Insert Sort)
2.2 希尔排序(Shell Sort)
3.选择排序
3.1 简单选择排序(Select Sort)
3.2 堆排序(Heap Sort) - 归并排序
4.1 二路归并排序(Two-way Merge Sort) - 线性时间非比较类排序
5.1 计数排序(Counting Sort)
5.2 桶排序(Bucket Sort)
5.3 基数排序(Radix Sort)
1. 交换排序
1.1 冒泡排序(Bubble Sort)
基本思想:比较相邻的元素。如果第一个比第二个大,就交换它们两个;小的放前面, 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数。
复杂度:
冒泡排序对n个数据操作n-1轮,每轮找出一个最大(小)值。
操作只对相邻两个数比较与交换,每轮会将一个最值交换到数据列首(尾),像冒泡一样。
每轮操作O(n)次,共O(n)轮,时间复杂度O(n^2)。
额外空间开销出在交换数据时那一个过渡空间,空间复杂度O(1)
Code:
def BubbleSort(lst):
n=len(lst)
if n<=1:
return lst
for i in range (0,n):
for j in range(0,n-i-1):
if lst[j]>lst[j+1]:
(lst[j],lst[j+1])=(lst[j+1],lst[j])
return lst
x=input("请输入待排序数列:\n")
y=x.split()
arr=[]
for i in y:
arr.append(int(i))
arr=BubbleSort(arr)
print(arr)
print("数列按序排列如下:")
for i in arr:
print(i,end=' ')
1.2 快速排序(Quick Sort)
基本思想:从数列中挑出一个元素,称为 “基准”(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
复杂度:
基准值若能把数据分为平均的两块,划分次数O(logn),每次划分遍历比较一遍O(n),时间复杂度O(nlogn)。
额外空间开销出在暂存基准值,O(logn)次划分需要O(logn)个,空间复杂度O(logn)
Code: