第三章:查找与排序(下)----------- 3.22 总结:10种排序算法的对比分析

总结:10种排序算法的对比分析:

 

*基础排序*:

冒牌排序:

       描述:谁大谁上,每一轮都把最大的顶到天花板。

       效率太低 O(n²)------掌握swap。

选择排序:

       效率较低,但经常用它内部的内部循环方式来找最大值和最小值------怎么一次性求出数组的最大值和最小值。 O(n²)

插入排序:

      虽然平均效率低,但在序列基本有序时,它很快,所有也有其适用范围。

 希尔排序:

      缩小增量排序,是插排的改良,对空间思维的训练有帮助。O(n的1.3次方)左右。

*分治法*:

1、子问题的拆分;

2、递归求解子问题;

3、合并子问题的解。

快速排序:

      快速排序是软件工业中最常见的常规排序法,其双向指针扫描和分区算法是核心,往往用于解决类似问题,特别地partition算法用来划分不同性质的元素,也用于著名的topk问题。

      selectK问题。记住。

      O(NlgN),如果主元不是中位数,特别地,如果每次主元都在数组区间的一侧,复杂度将退化为n²。

      工业优化:三点取中法,绝对中值法,小数据量用插入排序。

      快排重视子问题的拆分。

 归并排序:

      空间换时间----------逆序对。

      归并排序重视子问题的合并。

 堆排序:

      用到了二叉堆的数据结构。是掌握树结构的起手式。

      ==堆排+二分查找。

       上面三个都是NlgN的复杂度,其中快排表现最好,是原址的,不用开辟辅助空间;堆排也是原址的,但复杂度的常数因子较大,不具备优势。


       上面七种都是基于比较的排序,可证明它们在元素随机顺序情况下最好是NlgN,可用决策树证明。 


下面三个是非比较排序,在**特定情况**下会比基于比较的排序要快:

计数排序:

      可以说是最快的:O(N+k),k=maxOf(sourceArr),用它来解决问题时必须注意如果序列中的值,分布非常广(最大值很大,元素比较稀疏),空间会浪费很多。

      所以计数排序的适用范围是:**序列的关键字比较集中,已知边界,且边界较小**(比如:年龄)

桶排序:

      先分桶,再用其他排序方法对桶内元素排序,按桶的编号依次检出。(分配--收集)

      用它来解决问题必须注意序列的值是否均匀地分布在桶中。

      如果不均匀,那么个别桶中的元素会远多于其他桶,桶内排序用比较排序,极端情况下,全部元素都挤在一个桶里,还是会退化为NlgN。

      其时间复杂度:O(N+C),其中,C=N*(logN-lgM),约等于NlgN,N是元素数量,M是桶的个数。

基数排序:

      kN级别(k是最大数的位数),是整数数值型排序里面又快又稳的,无论元素分布如何。

      只开辟固定的空间(10个桶)。

       对比桶排序,基数排序每次需要的桶数量并不多,而且基数排序几乎不需要任何“比较”操作,而桶排序在桶数量相对较少时,数据难免集中到一个桶。桶内多个数据必须基于比较操作的排序。

       因此,在实际应用中,对十进制整数来说,基数排序的更好用。


比较:

 


要求:

      1、准确描述算法过程;

      2、写出伪代码;

      3、能分析时间复杂度;

      4、能灵活应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值