目录
8.2.3 希尔排序(不稳定 O(n2) O(n1.3) 顺序存储)
8.1 排序
8.1.1基本概念
8.1.2 稳定性
8.1.3 内部排序 vs 外部排序
8.1.4 分类
8.2 插入排序
8.2.1 直接插入排序 (O(n2) 稳定 可链式存储)
- 使用了哨兵
8.2.2 折半插入排序(O(n2) 稳定)
- 写一下试试
8.2.3 希尔排序(不稳定 O(n2) O(n1.3) 顺序存储)
- 又名 缩小增量排序
- trick: 多组数据同时进行直接插入排序
8.3 交换排序
8.3.1 冒泡排序(O(n2) 稳定 可以链式存储)
8.3.2 快速排序(O(n2) O(nlogn)不稳定)
- 这里交换的方式很巧妙
- 使用树的结构来理解,当划分的越均匀,,树越平衡,那么树的高度最小
- 最坏的情况(数组有序时)
- 如何选取 privot
- 前中后三个元素,进行比较后,确定大小居中的元素
8.4 选择排序
8.4.1 直接选择排序(O(n2) 不稳定)
8.4.2 堆排序
- 堆
- 小根堆:根节点存储的关键字是其子树中最小的
- 堆的初始化
- 堆排序(O(nlogn) 不稳定)
- 堆的插入
8.5 其他排序
8.5.1 归并排序
- 合并两个有序线性表
- 归并排序(总比较次数是不变的,O(nlogn) 稳定)
8.5.2 基数排序
- 分配和收集
8.6 内部排序算法的比较和应用
8.7 外部排序
8.7.1 归并排序的思想
r-划分的段数
d-读写总次数
t_io-一个归并段的一次读(写)用时
S-归并的趟数
n-1-每次归并时的比较次数
- 减少IO读写--增加归并路数(减少归并趟数)
8.7.3 败者树
m个归并段,n个元素
- 使用失败树后,S(n-1)(m-1)和m无关了,但是无限增大m是不行的
8.7.4 置换-选择排序
划分变长的划分段,并使之有序