交换排序 - 两两比较待排序列中的关键词,若是次序相反,则交换性能
冒泡排序
- 基本思路
1.从第一个关键字开始,比较相邻的两个关键字
2.若是逆序(假设须要排列为递增序列),则交换位置,直到最后一个关键字,此时最后一个关键字为最大值
3.重复1,直到一轮排序中,比较至最后两个关键字也没有发生交换,说明已经顺序排列
- 具体实现
- 时间复杂度 - O(n2)
- 最好状况 - 待排序列为正序,n-1次比较,无需交换
- 最坏状况 - 待排序列为逆序,n-1次排序
快速排序 Quick Sort
- 基本思路
1.在待排序列中选择一个元素v做为枢纽元
2.把待排序列分为3个子序列:小于v;v;大于v
3.对子序列进行排序,获得最终的顺序列
- 具体实现
1.将枢纽元与最后一个记录交换位置
2.初始化两个指针:first->record[0](第一个记录),last->record[i-1](最后第二个记录)
3.将first向后移动,直到指向第一个超过枢纽元的记录
4.将last向前移动, 直到指向第一个小于枢纽元的记录
5.first/last交换位置后, 重复3,4,5,直到first位于last后面
6.此时,将first指向的元素与枢纽元交换位置
- 枢纽元的选择 - 直接影响快速排序的性能
1.选择待排序列的第一个或者最后一个记录
- 在彻底随机的状况下能够,但若是通过预排列,可能子序列的规模会失衡
2.适用随机数发生器来选择
+ 优势 - 比较稳定
+ 缺点 - 生成随机数的比较费时
3.三数中值分割法
- 选择第一个记录,位于中间的记录和最后一个记录中的中值
- 存储结构 - 顺序存储
- 平均时间复杂度 - O(nlog2n)
- 空间复杂度 - 须要额外栈空间