基本的比较类排序算法
对之前学的一些知识点做个总结,比较简略。记录一些容易忘记的点。
本文主要根据现有知识总结非线性时间比较类排序算法。主要可以分为四大类:插入排序(直接插入排序 Insertion Sort、希尔排序 Shell Sort),交换算法(冒泡算法 Bubble Sort、快速排序 Quick Sort),选择排序(简单选择排序 Selection Sort、堆排序 Heap Sort),归并排序 Merge Sort(二路归并排序、多路归并排序)
参考文章: [C语言实现八大排序算法(一)](https://blog.csdn.net/bluesliuf/article/details/89043746?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161533578616780274140864%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161533578616780274140864&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-89043746.first_rank_v2_pc_rank_v29&utm_term=%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95)
[C语言实现八大排序算法(二)](https://blog.csdn.net/bluesliuf/article/details/89055198)
插入排序
直接插入排序 Insertion Sort
1.基本思想
将待排序的数列看成一个仅含有一个元素的有序数列和无序数列,将无序数列中的元素依次插入到有序数列中,放到正确的位置上去。
2. 复杂度
- 时间复杂度为O(n2):有两个for循环,从第二个元素开始遍历每一个元素;对于每一个元素,让它与之前的元素进行比较,知道找到正确的位置。(Best-case 0(n);worst-case O(n2); average O(n2))
- 空间复杂度0(1):都在原来的数组中做赋值或者交换的操作,不需要用到别的空间。
3.拓展:折半插入排序
折半查找到插入位置
希尔排序 Shell Sort
简单插入排序的优化,分组的简单插入排序
1.基本思想
相隔一个gap进行分组,组内进行插入排序;不断减小gap,直到每组只有一个元素。
2. 复杂度
- 时间复杂度为O(n(1+e),0<e<1):有两个for循环,每一次循环一整个能排好一个的顺序,最多要排e次 ;gap越小,需要交换的次数越少,越接近best case
- 空间复杂度0(1):都在原来的数组中做交换的操作,不需要用到别的空间。
交换排序
冒泡算法 Bubble Sort
1.基本思想
从第一个开始向后比较,大的交换到后面,保留较大的那一个再向后
2.复杂度
- 时间复杂度为O(n2):有两个for循环,每一次循环一整个能排好一个的顺序,要排n次
- 空间复杂度0(1):都在原来的数组中做交换的操作,不需要用到别的空间。
3.拓展:鸡尾酒排序
排序时是以首尾双向在序列中进行排序,左右同时进行排序,最左最右同时排好。
快速排序 Quick Sort
1.基本思想
选择一个pivot,根据比pivot大和比pivot小把无序数列分成左边的和右边的,然后再对这两个无序数列重复之前的操作
复杂度
- 时间复杂度为O(nlogn)
- 空间复杂度0(logn)
选择排序
简单选择排序 Selection Sort
1.基本思想
每次找到第i小的,然后和第i位交换
复杂度
- 时间复杂度为O(n2):有两个for循环,每一次循环一整个找到第i小的,要找i次
- 空间复杂度0(1):都在原来的数组中做交换的操作,不需要用到别的空间。
堆排序 Heap Sort
1.基本思想
利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。常用于top-k的问题。
把所有数加入到heap中再extract出来最大值
复杂度
- 时间复杂度为O(nlogn):insertion和deleteMin都需要logn的时间
- 空间复杂度0(1):都在原来的数组中做交换的操作,不需要用到别的空间。
归并排序 Merge Sort
二路/多路
1.基本思想:
分治的思想。分:对半分开;治:把两个有序数列合并成一个。从小到大一一比较。
2.复杂度
- 时间复杂度为O(nlogn):
- 空间复杂度0(n):combine的时候用到了一个新的数组
总结
排序法 | 平均时间 | 最坏情况 | 最好情况 | 空间复杂度 | 备注 |
---|---|---|---|---|---|
insertion sort | O(n2) | O(n2) | O(n) | O(1) | 适合大部分已经排序好的 |
冒泡排序 | O(n2) | O(n2) | O(n) | O(1) | 适合n比较小的时候 |
快排 | O(nlogn) | O(n2) | O(nlogn) | O(logn) | n较大时比较好 |
直接选择 | O(n2) | O(n2) | O(n2) | O(1) | n较小时比较好 |
heap sort | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | n较大时比较好 |
merge sort | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | n较大时比较好 |