排序算法

各种排序算法对比:

类别算法名称思想平均时间复杂度最坏时间复杂度最好时间复杂度空间复杂度是否稳定排序
插入排序直接插入排序顺序把待排序的数据元素取出插入到已排序子集合的适当位置中。子集合的个数从只有一个元素开始逐次增大,直到和集合大小相同排序完毕。O(n^2)O(n^2)O(n)O(1)稳定
希尔排序将待排序的数据元素分为若干组(按增量分组),对同一个组内的数据用直接插入法排序;小组的个数逐渐减少;当完成了所有数据元素在同一个组内的排序后排序结束。O(n(logn)^2) (约等于n1.3)O(1)不稳定(因为两个相同的元素可能分到了不同组)
选择排序直接选择排序从原始数据集合中选取最小的数据元素并将它与原始集合中第一个元素交换位置;然后从不包含第一个位置的余下的数据集合中选取最小的元素与原始集合中第二个数据元素交换位置…如此重复,直到余下的数据集合只剩一个元素为止。O(n^2)O(n^2)O(n^2)O(1)不稳定(因为交换可能会使相同的两个数据元素的位置发生改变)
从原始数据集合中取出最小的数据元素,将排在该元素前面的记录依次往后移,再把该元素放入原始集合中的第一个位置;从不包含第一个位置的余下的数据集合中再取出最小的元素,再将它前面的无序记录依次后移,然后把该元素放入原始集合中的第二个位置…如此重复,直到余下的数据集合只剩一个元素为止。O(n^2)O(n^2)O(n^2)O(1)稳定
堆排序(最大堆、最小堆)基于完全二叉树的排序。要进行堆排序,首先要创建堆,数组的N个数据元素对应完全二叉树的N个节点。若为最大堆排序,则不断交换父节点和子节点,使得所有的父节点都大于自己的孩子节点,此时根节点为数组中的最大数据元素,初始最大堆建立完毕。这时将根节点和最后一个叶子节点交换,相当于把最大值放到了数组的末尾,最大堆节点个数减一。然后数组前N-1个数重新参与创建最大堆,选出第大的数(根节点),再与最后一个叶子节点交换,相当于把第二大的数放到了数组倒数第二的位置,最大堆节点个数减一…如此重复,直到最大堆只剩一个元素为止。(最小堆即所有的父节点小于自己的孩子节点)O(nlogn)O(nlogn)O(nlogn)O(1)不稳定
交换排序冒泡排序循环比较n-1趟:第一趟时,依次比较相邻元素的值,若a[i]>a[i+1],交换两个元素,这样一趟完毕最大的数据元素将会冒泡到数组的最后面。第二趟时,第二大的数据元素会冒泡到数组倒数第二的位置…如此比较n-1轮,数组呈升序排列。O(n^2)O(n^2)O(n)O(1)稳定
快速排序是一种二叉树结构的排序方法、递归算法。从数组任取一个元素(通常取a[low])作为基准元素,以此为标准调整其他元素的位置,使得比基准元素小的元素分布在基准元素的左侧,比基准元素大或者相等的元素分布在基准元素的右侧。对于该基准元素划分的左右两个子数组,再分别递归调用上述过程 ,直到最后子数组只剩一个元素时停止。O(nlogn)O(n^2)O(nlogn)最好O(logn) / 最坏O(n) / 平均O(logn)不稳定
归并排序常用的是二路归并排序。初始时将数组看成是n个长度为1的有序子数组,将相邻的子数组两两合并,得到n/2个长度为2的新数组;对这些新的数组再两两归并,如此重复,直到得到一个长度为n的有序数组为止。O(nlogn)O(nlogn)O(nlogn)O(n)稳定
基数排序设待排序的数据元素为n个m位d进制整数(不足m位高位补0),设置d个桶,令编号分别为0,1,2…,d-1。首先按数字的最低位(即个位)将元素放入相应的桶中,然后按照桶号从小到大和进入桶中数据元素的先后次序收集分配在各桶中的数据元素,这样完成对数据的第一次排序;对一次基数排序后的数据元素序列再按次低位(即十位)的数值依次放入到相应的桶中,然后按照桶号从小到大和进入桶中数据元素的先后次序收集分配在各桶中的数据元素,完成第二次排序…如此重复,直到完成了第m次基数排序后,就得到了一个有序序列。O(mn)O(mn)O(mn)O(n)稳定
桶排序------

*以上logn均是以2为底。

特点:

希尔排序是直接插入排序的改进版,其按增量排序,为不稳定排序。
凡是用到了二叉树结构,时间复杂度一般为O(nlogn)。
凡是跳跃交换元素,都是不稳定排序。凡是邻近两两交换,一般是稳定排序。
归并排序:时间复杂度不仅三个都为O(nlogn),且为稳定排序,不过空间复杂度相较较高。

适用场景:

(1)直接插入、冒泡、直接选择的平均时间复杂度均为O(n^2)。其中,直接插入适合待排记录个数n较小或记录关键字基本有序的文件。
直接选择排序移动次数少,适合于待排记录所含数据项较多,存储量较大的情况。
(2)快排、堆排、归并排序的平均时间复杂度均为O(nlogn)。其中,堆排和归并排序适合待排记录n较大的情况,但归并排序的性能要优于堆排序。
(3)基数排序适合于待排记录个数n较大,而关键字位数d较小的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值