排序算法总结

1. 选择排序


选择排序改进了冒泡排序,将必要的交换次数从O(n2)减少到O(n),但是比较次数仍保持为O(n2)。冒泡排序每比较一次就可能交换一次,但是选择排序是将一轮比较完后,把最小的放到最前的位置(或者把最大的放到最后)。选择排序为大记录量的排序提出了一个非常重要的改进,因为这些大量的记录需要在内存中移动,这就使交换的时间和比较的时间相比起来,交换的时间更为重要。(一般在java中不是这种情况,因为java中只是改变了引用位置,而实际对象的位置并没有发生改变。)     算法分析:选择排序最好和最坏的情况一样运行了O(N2)时间,但是选择排序无疑更快,因为它进行的交换少得多,当N值较小时,特别是如果交换时间比比较时间大得多时,选择排序实际上是相当快的。平均复杂度也是O(N2)。
算法是不稳定的,假设a=b,且a在b前面,而某轮循环中最小值在b后面,而次最小值需要跟a交换,这时候b就在a前面了,所以选择排序是不稳定的。空间复杂度为O(1),不需要额外的空间。

2. 插入排序


插入排序的实现步骤为:从第一个元素开始,该元素可以认为已经被排序 -> 取出下一个元素,在已经排序的元素序列中从后向前扫描 -> 如果该元素小于前一个元素,则将两者调换,再与前一个元素比较–> 重复第三步,直到找到已排序的元素小于或者等于新元素的位置 -> 将新元素插入到该位置中 -> 重复第二步
算法分析:插入排序最好的情况是序列已经是升序排列了,在这种情况下,需要进行N-1次比较即可,时间复杂度为O(N),最坏的情况是序列降序排列,这时候时间复杂度为O(N2)。因此插入排序不适合对于数据量比较大的排序应用。但是如果需要排序的数据量很小(如小于千),那么插入排序还是一个不错的选择。插入排序平均时间复杂度为O(N2),但是它要比冒泡排序快一倍,比选择排序还要快一点,经常被用在较复杂的排序算法的最后阶段,例如快速排序。算法是稳定的,假设a=b,且a在b的前面,其排序位置必然比b先确定,而后面再插入b时,必然在a的后面,所以是稳定的。
空间复杂度为O(1),不需要额外的空间。

3.希尔排序


希尔排序的中心思想是将数据进行分组,然后对每一组数据进行插入排序,在每一组数据都有序后,再对所有的分组利用插入排序进行最后一次排序。这样可以显著减少数据交换的次数,以达到加快排序速度的目的。   算法分析:希尔排序时间复杂度平均为O(NlogN),最好与最坏情况要根据具体的增量序列来判断,对于不同的增量序列有不同的复杂度。希尔排序的性能优于直接插入排序,因为在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来随着增量逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但是由于已经局部排过序了,所以已经接近有序状态,新的一趟排序过程也较快。因此,希尔排序在效率上较直接插入排序有较大的改进。
希尔排序是不稳定的,因为不同的间隔对应的数据是独自比较的,如果a=b,但是不在同一个间隔上,显然会出现前后颠倒的情况,所以希尔排序是不稳定的。
空间复杂度为O(1),不需要额外的存储空间。
 


4.快速排序


快速排序算法是最流行的排序算法,因为有充足的理由,在大多数情况下,快速排序都是最快的,执行时间为O(NlogN)级(这只是对内部排序或者说随机存储器内的排序而言,对于在磁盘文件中的数据进行的排序,其他的排序算法可能更好)。快速排序本质上通过一个数组划分为两个子数组,然后递归地调用自身为每一个子数组进行快速排序来实现的,即算法分为三步:
4.1. 把数组或者子数组划分为左边(较小的关键字)的一组和右边(较大的关键字)的一组;
4.2. 调用自身对左边的一组进行排序;
4.3. 调用自身对右边的一组进行排序。

5.归并排序


归并排序的思想是把一个数组分成两半,排序每一半。然后用merge方法将数组的两半归并成一个有序的数组。被分的每一半使用递归,再次划分排序,直到得到的子数组只含有一个数据项为止。正如上面所说的,归并排序需要额外的一个和AB两个数组总和相等的空间,如果初始数组几乎沾满了整个存储器,那么归并排序就不能工作了。


6.拓扑排序 


拓扑排序的思想虽然不寻常,但是却很简单,有两个必要的步骤:
1. 找到一个没有后继的顶点;
2.从图中删除这个顶点,在列表中插入顶点的标记
然后重复1和2,直到所有顶点都从图中删除,这时候列表显示的顶点顺序就是拓扑排序的结果了

Despacito

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值