内部排序方法小结

 最近一些公司的实习笔试面试陆续开始,在此把一些常用的内部排序方法总结一下,也算是温故而知新。

插入排序:插入排序就是逐个将未排序的元素插入到已经排好序的序列中,从而完成整个序列的排序。插入排序中最典型的就是直接插入排序和希尔排序。

直接插入排序:从一个元素开始,每次选取一个新的元素插入的合适的位置,从而形成有序的序列,直到所有元素都已经完成排序。 该算法的特征是当待排序的序列基本有序的时候,该算法的效率非常高,仅需要进行n-1次元素之间的比较,不需要元素之间的挪动,时间复杂度可以达到    O(n);当待排序的序列处于“逆序”状态的时候,该算法的效率较为低下,需要进行(n-1)n/2次元素的挪动和比较,时间复杂度可以达到O(n^2);

希尔排序:针对直接插入排序在待排序序列基本有序的情况下效率较高的特点,希尔排序采用缩小增量的方法对待排序序列进行排序。该方法每次选取一定大小的增量,构成若干个子序列,然后分别对这些子序列进行排序。最后对所有待排序元素进行一次直接插入排序。该排序算法的效率跟增量选取的方式有关。但是目前尚未有人求出一种最好的增量序列,因为这涉及到数学上一些未解决的问题。在选择增量的时候,应该注意       增量之间应该没有除了1以外的公因子,同时,最好一个增量必须为1

选择排序:选择排序的思想是在第i轮迭代中,选取第i小的元素放在位置i上。比较常见选择排序有简单选择排序和堆排序。

简单选择排序:在第i轮迭代中,逐个比较剩下的n-i个元素,并且选取最小的元素和当前第i个元素交换位置。该算法与插入排序相比元素需要移动的次数较少,最少需要0次,最多需要3(n-1)次。但是查询次数无论如何都是n(n-1)/2次。

堆排序:堆实际上是一棵完全二叉树,但是他的每一棵子树(包括自己)的根节点都要比孩子节点小(小根堆)或者大(大根堆)。堆排序就是利用堆的这种性质,在第i轮迭代中利用堆在剩下的n-i个元素中选取最小的元素放在第i个位置。堆排序的时间复杂度为O(nlogn);而且仅需要一个元素大小的交换空间。

快速排序:选取一个元素,然后将序列中比该元素小的元素都放在该元素的一边,比该元素大的都放在另一边,然后分别对该元素两边的元素做同样的操作。

该排序算法在平均情况下时间复杂度为O(nlogn),但是常数因子最小,因而是最为常用的一种内部排序方法。但是当待排序列处于有序状态下的时候,该算法的性能最                差, 达到O(n^2).

  归并排序:该排序算法利用了一种叫做“归并”的操作。该操作可以将多个有序的序列合并成一个有序序列。归并排序先将待排序列分成多个小的子序列,然后将这些序列逐个归并成一个有序的序列

该算法的时间复杂度为O(nlogn);另外,归并排序是复杂度为O(nlogn)的排序算法中唯一一种稳定的排序方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值