【19软工1班】常用排序总结——比较排序

用户头像
来自上海海洋大学-王天怡发布于:2020-04-16 10:03:59

    常说的排序一般指内部排序算法,即记录在内存中进行排序
    大体分为两种:
    (一)比较排序,时间复杂度O(nlogn)~O(n^2),主要有:冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序;(二)非比较排序,时间复杂度:O(n),主要有:基数排序、计数排序、桶排序  

排序算法的稳定性
排序算法的稳定性简单定义为:如果Ai = Aj,排序前Ai在Aj前,排序后Ai还在Aj前,则称这种排序算法是稳定的。即保证排序前两个相等的数相对顺序不变。
排序算法的稳定性是由具体算法定的,在某种条件下,稳定的可变不稳定,不稳定也可变稳定
比如冒泡排序,如果把交换条件加一个等号,就会从稳定的排序变成不稳定的排序
 

冒泡排序(bubblesort)
依次比较相邻两个元素,如果顺序错了就调换一下,直到没有元素需要交换
最差时间复杂度:O(n^2)
最优时间复杂度:O(n) 
平均时间复杂度:O(n^2)
稳定性:稳定
冒泡排序有很多细节优化
优化一:排序完成就退出排序,设置一个flag判断是否已经有序
优化二:优化一保证了循环次数最优,但是对于有序部分仍需要比较。那么就可以在优化一的基础上设置一个边界,减少比较次数
优化三:定向冒泡排序,又名鸡尾酒排序,排序方法是从低到高再从高到低(冒泡排序只是从低到高比较每个元素)
但是,乱序下,不管怎么优化,冒泡排序的效率依旧很差劲눈_눈

选择排序(select sort)
简单直观:每次找最小(大)的放到首(尾),再在剩余未排序的元素中继续找最小(大)
最差时间复杂度:O(n^2)
最优时间复杂度:O(n^2) 
平均时间复杂度:O(n^2)
稳定性:不稳定


快速排序(quick sort)
*利用的是分治策略:选出一个基准,把比基准小的放基准前,把比基准小的放基准后面,对每个分区递归进行上述操作。
最差时间复杂度:O(n^2)(每次选的基准都是最小或最大的元素,需要进行n-1次划分)
最优时间复杂度:O(nlogn)  (每次选的基准都是中位数,只需要logn次划分)
平均时间复杂度:O(nlogn)
稳定性:不稳定


归并排序(merge sort)
归并排序的实现分为递归实现(分治)和非递归实现(合并)
最差时间复杂度:O(nlogn)
最优时间复杂度:O(nlogn) 
平均时间复杂度:O(nlogn)
稳定性:稳定


堆排序(heap sort)
最差时间复杂度:O(nlogn)
最优时间复杂度:O(nlogn) 
平均时间复杂度:O(nlogn)
稳定性:不稳定


插入排序(insertion sort)
插入排序的原理类似于我们玩扑克牌的时候理牌或者站队的时候老师按大小个排队时给同学调整位置
对于未排序序列,在排好的序列中从后往前扫,找到正确位置插入
从第二个元素开始(默认第一个元素已有序)作为新元素,从后向前扫有序序列,如果有序数列中的元素大于新元素,则将它向后移一个位置,直到在有序数列中找到小于或等于新元素的,把新元素插入到它后面。
最差时间复杂度:O(n^2)(原数列降序排列)
最优时间复杂度:O(n)  (原数列升序排列)
平均时间复杂度:O(n^2)
稳定性:稳定
优化一:常用二分查找优化比较次数,称为二分插入排序
最差时间复杂度:O(n^2)
最优时间复杂度:O(nlogn) 
平均时间复杂度:O(n^2)
稳定性:稳定
优化二:希尔排序(shell sort),又名递减增量排序
希尔排序取一个步长,这样比较交换时可以让元素一次性朝最终位置前进一大步(优化插入排序每次只移一步),再取越来越小的步长,直到最后一步又变成普通的插入排序,但此时序列已接近升序
最差时间复杂度:O(n(logn)^2)
最优时间复杂度:O(n) 
平均时间复杂度:取决于所取步长
稳定性:不稳定(在各自排序中相等顺序可能打乱)
——Eirlys

点赞 (26) 回复
发布回复
点击图片