第八章.排序
1.直接插入排序:平均时间复杂度O(n^2)
若待排序列为接近有序,时间复杂度可以达到O(n)
2.希尔排序不稳定
3.快速排序
空间复杂度:最好O(logn),最坏O(n),平均O(logn)
时间复杂度:最坏O(n^2),序列基本有序或逆序
平均O(nlogn)
4.简单选择排序
比较次数与序列初始状态无关,始终为n*(n-1)/2次
不稳定
5.堆排序
(1)n个结点的完全二叉树,最后一个非终端结点 (n/2向下取整)
(2)建堆:从最后一个非终端结点开始,依次向下调整
插入:新结点放在堆的末端,然后该结点再向上调整
(3)从1亿个数中选前100个最大值
用一个大小为100的数组,读入前100个数,建立小根堆。
再依次读剩下的数,若小于堆顶元素则舍弃,否则代替原根
结点的数,再向下调整。待数据读取完毕,堆中100个数字为所求。
(4)
空间复杂度:O(1)
建堆时间:O(n),建堆后有n-1次向下调整过程
时间复杂度:O(nlog2n)
不稳定
6.归并排序
空间复杂度:O(n)
时间复杂度:共需要 (log2(n)向上取整 ) 趟,每趟O(n)
总时间复杂度 O(nlog2n)
7.基数排序
稳定
8.冒泡排序
平均 O(n^2)
最好 O(n)
9.外部排序
(1)外部排序:将待排序记录存储在外存上,排序时将数据一部分一部分地调入内存进行排序
(2)外部排序时间代价主要考虑磁盘访问次数(IO次数)
(3)减少IO次数:增大归并路数,从而减少归并趟数
(4)大致流程
1.内部排序,得到初始归并段
2.对初始归并段进行内部归并,依此类推,最终得到整个有序文件
(5)内部归并时间随着路数上升而上升,因此不能用常规的内部归并算法,而是引入了败者树
(6)若归并路数k过大,则输入缓冲区数量要变大,每个缓冲区容量减小,IO次数增大