排序总结

 

排序分为两大类:内部和外部

内部排序是待排序列队存放于内存中

外部排序是大数据量,无法全部放入内存中

 

先来分析一下内部排序的大类

一:插入排序:
1:普通,

向前比较,从后向前插入,方便移动数组,复杂度0(n2)

2:折半
       用折半查找的方式,减少了比较次数,提高了查找插入点的效率,

但就其排序效率角度讲,没有提高。

 

3:2-路插入排序

       将队列分成2列,分别进行插入排序。

 

4:表插入排序

       用链表的形式来处理2-路插入排序

 

 

二:希尔排序(缩小增量排序)

       对于待排序列是大致有序的情况,插入排序时间复杂度可以提高到0(n)级别。鉴于此,提出希尔排序,其思想隶属于插入排序。

       基本步骤:将待排序列分成若干子段(非随机,相隔递增分段),然后各自进行插入排序,之后将各个子段在进行一次插入排序。

 

三:冒泡排序

 

四:快速排序

       是冒泡排序的衍生改进。

通过一趟排序将待排记录分割成独立的两个部分,其中一部分记录的关键字均比另一部分记录的关键字下,则可对这两个部分记录继续进行排序,以达到整个序列有序。

“枢轴”概念。

 

五:选择排序

1:简单选择排序:

       经过N趟排序完成任务,每趟排序都是寻找当前待排列队的最小值。

       将第i趟寻找到的最小数放在与原i位置数交换。

 

2:改进后的选择排序

       树形选择排序:父节点为当前树的最小值,每次都从父节点开始寻找接下来的最小值作为父节点。

       堆排序:堆特点是父节点都大于两个子节点,或都小于两个子节点

通过建一次堆,堆顶元素即为遴选出的最小值(最大值),通过n次建堆后,排序结束。

      

六:归并排序

       首先两两组合排序,分成n/2组

       接下来继续两两排序, 分成n/4组

       依次执行,最后实现排序算法。

 

七:基数排序

1:多关键字排序,即依据2个及以上条件排序。

       例子如整理扑克牌,按花色以及数字大小 排列。此处有两种关键字,花色和数值。

花色优先,数值在后

若按花色分成4堆,然后在按数值排序 ,称为MSD。

       若按数值分成13堆,然后再按花色排序,称为LSD。

      

2:链式基数排序

       例子:对一系列5位数排序,可以将5位数分成5个关键字,万千百十个。

       在按照上面关键字的思想排序。

 

再来分析一下外部排序:

数据量庞大导致无法在排序前将数据全部放入内存中,需要在排序过程中执行外部数据读写操作。事实证明优化外部排序的关键是减少外部数据读写的次数,提高数据传输效率。

       外排时所需读写外存的次数和归并的趟数成正比。对m个初始归并段进行k-路平衡归并时,归并的趟数s = [logk(m)];所以可以从增大k和减小m来达到目的。

 

总结:

优化排序的方法无非两种,减少时间复杂度,空间复杂度。

1:分组(分制治)是硬道理,他可以将空间复杂度换取时间复杂度。

2:稳定排序:排序的结果是唯一的,反之则不唯一(键值相同情况先后不一)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值