[Data Structure & Algorithm] 交换排序
交换排序 - 两两比较待排序列中的关键词,如果次序相反,则交换
冒泡排序
- 基本思路
1.从第一个关键字开始,比较相邻的两个关键字
2.如果逆序(假设需要排列为递增序列),则交换位置,直到最后一个关键字,此时最后一个关键字为最大值
3.重复1,直到一轮排序中,比较至最后两个关键字也没有发生交换,说明已经顺序排列 - 具体实现
- 需要额外变量来标志一轮排序中是否有过交换
- 初始值为True,如果发生交换,则置为False
- 需要额外变量来标志一轮排序中是否有过交换
- 时间复杂度 - 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)
- 空间复杂度 - 需要额外栈空间