[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)
  • 空间复杂度 - 需要额外栈空间
posted @ 2018-10-28 15:27  break大蜗牛  阅读(165)  评论(0编辑  收藏  举报