框架
排序 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
基本概念 | 内部排序 | 外部排序 | |||||||||
稳定性 | 衡量标准 | 插入排序 | 交换排序 | 选择排序 | 归并排序 | 基数排序 | 多路归并排序 | ||||
时空复杂度 | 直接插入排序 | 折半插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 |
各种内部排序算法的比较 | |||||||||
---|---|---|---|---|---|---|---|---|---|
插入排序 | 交换排序 | 选择排序 | |||||||
排序方法 | 直接插入排序 | 折半插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 |
时间复杂度 | O(![]() | O(![]() | O(![]() ![]() | O(![]() | O(![]() | O(![]() | O(![]() | O(![]() | O(d(n+r)) |
空间复杂度 | O(1) | O(1) | O(1) | O(1) | O(1) 递归栈最差O(n) | O(1) | O(1) | O(n) | O(r) r个队列
|
稳定性 | 稳定 | 稳定 | 不稳定 | 稳定 | 不稳定 | 不稳定 | 不稳定 | 稳定 | 稳定 |
简述 | ①在L[1,...,i-1]中找到L[i]的插入位置k ②将L[k,...,i-1]中的元素全部后移一个位置 ③将L[i]复制到L[k] | ①二分法找到L[i]在L[1,...,i-1]中的插入位置k ②将L[k,...,i-1]中的元素全部后移一个位置 ③将L[i]复制到L[k] | 将待排序表分割为L[i,i+d,...,i+kd]的特殊子表,分别进行插入排序,当表中元素已基本有序时,再对全体记录进行一次直接插入排序。 d1=n/2; | 从后往前,两两比较,交换 | 取一个元素做为基准,将大于,小于它的分为二部分递归 | 第i次选[i,n]中最小元素放到i位置 | 大根堆(根大于儿子,从下往上,右往左,儿子较大者>当前结点,交换这两个的值,),小根堆(反之) | 将两个或两个以上的有序表组合成一个新的有序表 | (特别:不基于比较进行排序)(多关键字排序思想) 按关键字d优先级->优先级高 排d次 (利用其稳定性。) |
外部排序
概念:文件记录庞大,内存一次放不下时,需要将待排序的记录存储在外存上,排序时再把数据一部分一部分的调入内存。排完序后放到原文件。
常用方法:归并排序
败者树:除根节点存最小值(即最后胜利者)外,其他非叶结点均存放 左右子树的胜者 中的败者。
例:
多路平衡归并排序(这块不难,拿书看看,熟悉一下流程就可以了。)
1、置换-选择排序(生成初始归并段)
2、最佳归并树(多趟归并排序)