#排序算法总览
桶排序和基数排序太废了不展示。
排序算法 | 平均时间复杂度 | 最佳情况 | 最坏情况 | 空间复杂度 | 稳定性 | 排序的对象 |
冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | Yes | 数组 |
选择排序 | O(n^2) | O(n) | O(n^2) | O(1) | No | 数组、链表(链表稳定) |
插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | Yes | 数组、链表 |
希尔排序 | O(n^1.3) | O(n) | O(n^1.3) | O(1) | No | 数组 |
归并排序 | O(n*logn) | O(n*logn) | O(n*logn) | O(n) | Yes | 数组、链表 |
快速排序 | O(n*logn) | O(n^logn) | O(n^2) | O(n*logn) | No | 数组 |
堆排序 | O(n*logn) | O(n*logn) | O(n*logn) | O(1) | No | 数组 |
计数排序 | O(n+k) | O(n+k) | O(n+k) | O(k) | Yes | 数组、链表 |
#冒泡排序
1、从数组的第一个数开始,每个数与它后面的数比较,直到排序末尾。
2、若后面的数比较小,则交换两个数。
3、将最后一次比较的后一个数作为排序末尾。
3、若执行过2的交换,则回到步骤1,否则结束。
图片出处:冒泡排序与选择排序(方法+动画+算法十大排序分类图)_选择排序和冒泡排序-CSDN博客
#选择排序
0、先选择数组开始的位置的数为“排序开始的位置”。
1、让“排序开始的位置”的数为key,然后让key依次与后面的其他数依次进行比较。
2、若有值比key小,那让key等于较小的值。
3、比较完最后一个数后,将数组“排序的开始位置”的数和key交换。
4、若“排序开始的位置”不为数组末尾。将“排序开始的位置”往后移动一位,然后回到步骤1。
图片出处:动画:一篇文章快速学会选择排序_javabianc-CSDN博客
#插入排序
0、让数组中第一个数作为key。
1、让key与它前面的数依次比较。
2、遇到比key大的数,让较大的数向后移动一位。遇到比key小的数,将key插入到较小的数的后一位。
3、直到数组的所有数全成为过key之前。重新选取下一个数为key,然后回到步骤1。
图片出处:数据结构-插入排序(直接插入排序+折半插入排序)_编写一个程序,分别用直接插入排序和折半插入排序实现对线性表中数据元素的排-CSDN博客
# 希尔排序
1、将数组中的元素"分组",每组中,每个元素之间相隔gap-1个元素。
2、对每个组进行插入排序,全部进行插入排序后,让gap=gap/3+1(图中是/2)。
3、若未执行过gap=1。则回到步骤1。
图片出处:【排序】经典排序算法动画详解----希尔排序C语言实现_希尔排序c语言代码-CSDN博客
#归并排序
0、创建一个临时数组temp。
1、将“需排序的数组”分成两半(前一半数组a和后一半数组b):
(数组中只有一个元素时,那它就一定是有序的)
(1)若a,b都有序,则将a中第一个数a1与b中所有数依次比较:
*若a1小于b1,则将a1放到temp中,然后a2与b1比,依次类推。
*若a1大于b1,则将b1放到temp中,然后a1与b2比,依次类推。
*若a(或b)数组的元素再比较完成后有剩余,则让a(或b)数组剩余的元素依次放入temp中。
*当a,b的元素全放入temp后,temp将这些元素按照对应的位置返回给原数组。
(2)若a,b中有无序的,让无序的部分称为“需排序的数组”执行步骤1。
# 快速排序
找半天了动图,就没有霍尔和挖坑法的好动图,指针法的动图更是垃圾。
所以我找了个视频,里面是挖坑法,好理解:三分钟学会快速排序_哔哩哔哩_bilibili
步骤逻辑:
1、将数组第一个数定为key。
2、创建L指针指向key,创建指针R指向数组末尾,key所在位置标记为hole。
3、R向左移动,找到比key小的数,R覆盖hole,R标记为hole。
4、L向右移动,找到比key大的数,L覆盖hole,L标记为hole。
5、若L和R未相遇,则回到步骤2。若相遇,将key放入相遇点,以相遇点为分割点,视为将数组分为两个子数组a,b(a,b均不含分割点)。
6、若a,b有元素不为0的数组,则让元素不为0的数组执行1。
#堆排序
1、将数组建成大堆
2、删除堆顶元素,向下调整
3、若堆不为空,则回到步骤2。
#计数排序
0、找出需排序数组的最大值max和最小值mini,创建大小为max-mini+1的临时数组temp,让temp中的元素值都为0,待排位置为待排序数组的第一个位置。
1、依次检测数组中的元素,让temp[检测到的元素-mini]的值+1。
2、寻找temp中不为0的元素:
若找到:
*将temp中(不为0的元素的下标+mini)放到待排序数组的待排位置
*待排位置向后移动一位
*若元素值不为0,将元素值-1,回到(1)。否则回到2步骤。
图片出处:https://blog.csdn.net/k1234hxh/article/details/134631590