排序分为两大类:内部和外部
内部排序是待排序列队存放于内存中
外部排序是大数据量,无法全部放入内存中
先来分析一下内部排序的大类
一:插入排序:
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:稳定排序:排序的结果是唯一的,反之则不唯一(键值相同情况先后不一)