本章我可能会犯错、要注意的点:
- 注意思考为什么会有那么多排序? 每个排序的特点价值在哪? 分别适用于什么场景?
- O(N)是排序的天花板,任何排序都不可能小于O(N)。
- 注意:排序的逐渐思考的过程;不要仅仅关注最终代码模板!
- 排序的稳定性概念:具有相同的关键字的记录,排序后,相对位置保持不变。
- 希尔排序,多次预排序 + 1次直接插入排序
- 希尔排序,gap越大,预排序越快,预排后越不接近有序。
- 冒泡排序虽然简单,但是写法上要注意边界控制! 边界易错~
- 快速排序是基于分治的一种算法。
- 快速排序中的单趟排序后的目标(选最左边做key):使得最终L左边的值要比key小,R右边的值要比key大
- 快速排序:选左边的值做key,右边先走 ==> 保证了,左右相遇时的值,一定比key小 选右边的值做key,左边先走 ==> 保证了,左右相遇时的值,一定比key大
- 快速排序中的 单趟排序的时间复杂度是:O(N) ;
- 快速排序的最好的时间复杂度是:O(N * logN) ; 最坏是:O(N^2)
快速排序的缺陷是对于有序数据的排序性能非常差!!O(N^2)
注意:递归的缺点(有两点~)
快速排序的两种优化方案:(1)三数取中:三数取中法选key(2)小区间优化:递归到小的子区间时,可以考虑使用插入排序
快速排序对于2 2 2 2...(数值一样的)和2 3 2 3...这种不适合!
归并排序非递归版本的思想简单,但是要非常非常注意它的边界修正! 极其恶心!
计数排序在数组中数值的大小范围比较集中的情况下,可以达到O(N),是一个非常牛逼的排序
计数排序也可以对负数进行排序,但是不适合,一般对负数排序不采用计数排序。
目录