排序
十大排序算法:冒泡、插入、选择、希尔、快速、归并、堆、计数、桶、基数
分类:
* 插入排序、希尔排序
希尔排序是插入排序改良版本,按步长跳跃产生子序列,子序列采用插入排序;步长逐步(n/2,n/4,n/8...1)缩小到1,即可。
* 冒泡排序、快速排序
快速排序可认为借鉴冒泡排序,将其中大于基数哪些项冒泡到右边,小于基数那些项沉淀左边。逐渐左右分治,递归缩小长度;对于小于阈值后,采用插入排序。
* 选择排序、堆排序?
堆排序源于竞技类体育比赛。
* 归并排序
从有序到有序,小数组merge成大数组,一直保持有序。
* 计数排序、桶排序、基数排序
线性算法,很快不过内存消耗大。
* 对比
最好时间 | 最差时间 | 平均时间 | 空间 | 位置 | 稳定性 | |
插入排序 | n | n2 | n2 | 1 | 稳定 | |
希尔排序 | n | n2 | n1.3 | 1 | 不稳定 | |
冒泡排序 | n | n2 | n2 | 1 | 稳定 | |
快速排序 | n | n2 | nlogn | 1 | 不稳定 | |
选择排序 | n2 | n2 | n2 | 1 | 不稳定 | |
堆排序 | nlogn | 1 | 稳定? | |||
归并排序 | nlogn | n | 稳定? | |||
计数排序 | n | n | n | k | 不稳定 | |
桶排序 | n? | 不稳定? | ||||
基数排序 | n? | 不稳定? |
* std sort
小数据,插入排序
大数据,如果递归不深,快速排序
大数据,递归深,堆排序
循环上述三个步骤,直到排序完成