各种排序算法总结
本文主要是为了总结各种算法的写法,复杂度,以及稳定性分析,主要是个人做个记录,如果有任何需要修改或优化的地方欢迎在评论区留言哦!
排序算法时间、空间、稳定性表
算法 | 最好 | 最坏 | 平均 | 空间 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n) | O(n2) | O(n2) | O(1) | 稳定 |
选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 |
插入排序 | O(n) | O(n2) | O(n2) | O(1) | 稳定 |
快速排序 | O(nlog n) | O(n2) | O(nlog n) | O(log n)-O(n) | 不稳定 |
归并排序 | O(nlog n) | O(nlog n) | O(nlog n) | O(n) | 稳定 |
希尔排序 | O(n^1.3) | O(n2) | O(nlog n)-O(n2) | O(1) | 不稳定 |
计数排序 | O(n+k) | O(n+k) | O(n+k) | O(n+k) | 稳定 |
基数排序 | O(nk) | O(nk) | O(nk) | O(n+k) | 稳定 |
桶排序 | O(n) | O(n) | O(n) | O(n+m) | 稳定 |
堆排序 | O(nlog n) | O(nlog n) | O(nlog n) | O(1) | 不稳定 |
注:稳定性是指:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
冒泡排序 Bubble Sort
概述
作为本人踏入算法殿堂学习的第一个排序算法,冒泡排序可以算是经典算法之一了,它的基本思想是:*两个数比较大小,较大的数下沉,较小的数冒起来*。
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
图示
Python 算法实现
1 | def bubble(array): |
复杂度
平均时间复杂度 O(n2)
选择排序 Selection Sort
概述
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
图示
Python 算法实现
1 | def selection(array): |
复杂度
平均时间复杂度 O(n2)
插入排序 Insersion Sort
概述
插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
图示
Python 算法实现
1 | def insertion(array): |
复杂度
平均时间复杂度 O(n2)
快速排序 Quick Sort
概述
快速排序的最坏运行情况是 O(n2),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。
从数列中挑出一个元素,称为 “基准”(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
图示
Python 算法实现
1 | def partition(arr, low, high): |
复杂度
平均时间复杂度 O(nlog n)
归并排序 Merge Sort
概述
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
设定两个指针,最初位置分别为两个已经排序序列的起始位置;
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
重复步骤 3 直到某一指针达到序列尾;
将另一序列剩下的所有元素直接复制到合并序列尾。
图示
Python 算法实现
1 | def merge(array, l, r): |
复杂度
平均时间复杂度 O(nlog n)
Reference
排序算法的稳定性及其意义_u012501054的博客-CSDN博客
图片版权所有为菜鸟教程 runoob.com,如有侵权请联系删除。