排序算法

  • 插入类:
基本过程是:在有序序列中查找插入位置,将插入位置后的有序序列后移一位,将该元素插入到有序序列。
  1. 直接插入排序:通过顺序查找方式查找插入位置
  2. 折半插入排序: 通过折半查找方式查找插入位置。记录比较的次数减少,但移动记录的次数没有减少
  3. 表插入排序:用静态链表来实现,从而使得记录不需要移动。但比较的次数不变
  4. 希尔排序:跳跃式的直接插入排序,实现序列基本有序。一趟排序的结果是使增量为d的子序列有序,例如增量为3时,保证1 4 7 。。。,2 5 8。。,有序,增量逐渐减小,直到增量为1实现全序列的有序。

 

  • 交换类:
通过交换序列中元素的位置,使得序列有序的方式。
  1. 冒泡排序:一趟排序的结果是使无序子序列中最大或者最小的记录'冒'出来,进入到有序子序列中。冒泡排序终止的条件是:一趟排序中没有交换操作,说明序列已经有序,所以排序终止。另外冒泡排序也很聪明:它会记录上一趟排序的最后交换位置,然后该趟排序只是从1到最后交换位置(1到最后交换位置)进行交换,因为最后交换位置后的序列已经有序。每趟排序最后交换位置的初始值为1,因此如果一趟排序没有交换,则下次排序是从1到1,排序终止。注意:在《数据结构》中没有给出冒泡排序的伪代码,因此很多人都误以为它需要n(n-1)/2次比较,实际上它比我们想象的要smart得多,严蔚敏的视频讲座中有源码介绍;
  2. 快速排序:也是先进行宏观的排序,使得序列基本有序。一次排序的结果使得枢轴右边的数都比它小,枢轴左边的数都比它大,一趟排序终止的条件是low==high。然后分别对子序列进行递归,直到子序列只有一个记录时为止。快速排序被认为是目前最好的排序方法。

 

  • 选择类:
从无序序列中选择出关键字最小的记录放在有序序列中。
  1.  
    1. 简单选择排序:一趟排序的结果是从无序序列中选择关键字最小的记录放在有序序列中,使得有序序列的长度增加1。选择排序的比较次数对于完全有序和完全逆序是相同的,即不取决于序列本身,没有最好情况和最差情况。
    2. 堆排序:将之前选择过程的结果复用到当前的选择中,从而减少比较的次数。得以复用的原因是将数据用堆保存。堆顶的元素即是被选择出来的元素,然后将无序序列中的最后一个元素放在堆顶,调整堆的结构使之继续满足堆的特性。在调整成堆的过程最多比较的次数等于完全二叉树的深度。堆的概念:满足任意一个父节点都比它的子节点大或者小的完全二叉树,

 

  • 归并排序:
  1. 将两个有序序列合并为一个有序序列。递归地将一个无序序列分割为两个有序序列,直到子序列只有一个元素为止而自然有序为止,然后向上回溯进行归并。归并过程需要将两个有序子序列的元素拷贝到目的序列中,使之整体有序。

 

 

附言: nlogn是排序时间复杂度的下限(不是极限,极限只能无限趋近),不会有复杂度更低的排序方法。这个结论如果声明不存在永动机一样。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值