排序算法总结

来源:互联网 发布:华为提示停用移动数据 编辑:程序博客网 时间:2024/04/29 19:25

内部排序


插入排序

插入排序就是将每个待排序的记录插入前面已经排序号的区域中的适当位置,直到全部记录完成插入。

 

直接插入排序

 

对于R[1]-R[n]的数组:

(1) R2和[R1]比较,形成有序区[S1, S2];

(2) R3和有序区[S1, S2]的每个元素比较(从大到小),R3小于Sx时,两两互换位置,形成有序区[S1,S2,S3];

...

(n-1) Rn和有序区[S1, ... , Sn-1]的每个元素比较(从大到小),Rn小于Sx时,两两互换位置,形成有序区[S1 , ... , Sn],排序完成。

 

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

对于R[1]-R[n]的数组:

(1) 取小于n的整数d为增量,将数组分成若干组:

[R1, Rd]

[R2, Rd+1]

[R3, Rd+2]

...

[Rn-d, Rn]

对每个组中的两个值进行两两比较和互换后形成新的数组。

(2) 取小于原整数增量的新整数增量d,将数组分成若干组,重复步骤(1),形成新的数组。

...

(m) 取d=1,将数组分为n组,重复步骤(1),形成新的数组,排序完成。最后一步实际上就是直接插入排序。

 

交换排序

交换排序就是两两比较待排序的记录,如果发现次序相反则进行交换,直到没有反序的的记录为止。

 

冒泡排序

对于R[1]-R[n]的数组:

(1) Rn依次和Rn-1 ... R0两两比较,如果Rn小于比较值,两两互换位置,形成有序区[S1];

(2) 新的Rn依次新的Rn-1 ... R1两两比较,如果Rn小于比较值,两两互换位置,形成有序区[S1, S2];

(3) 不断在无序区中重复以上过程,直到最后一步Rn和Rn-1比较,形成有序区[S1 , ... , Sn],排序完成。

 

快速排序

对于R[1]-R[n]的数组:

(1) 取R[1]-R[n]中的任意记录Rx为比较因子(如R1),从R0和Rn两端分别向中间交替扫描:

R1和R2比较互换

R1和Rn比较互换

R1和R3比较互换

R1和Rn-1比较互换

……

直到在中间会合,排序完成,R1也被定位在应该在的位置,排序完成。

 

选择排序

选择排序的原理是:每一趟从待排序的记录中选出最小的记录,顺序放在已经排好序的区域后面,直到全部记录排序完毕。

 

直接选择排序

(1) 在R1-Rn中选出最小的记录,和R1互换;

(2) 在R2-Rn中选出最小的记录,和R2互换;

……

(3) Rn-1和Rn比较互换,排序完毕。

 

堆排序

将待排序记录堪称一棵完全二叉树进行排序。因为是完整二叉树,每个节点和数组下标有固定的换算关系。

(1) 建堆:按照“父节点必须大于等于其孩子节点”的原则对二叉树的节点进行递归互换调整,方法是对R(n/2) ... R1依次进行检验。符合这个原则的二叉树成为大根堆;

(2) 从Rn开始,依次将Rn, Rn-1, ... , R1和R0进行比较互换,互换结束后数组即排序完毕。

 

归并排序

将一个数组分为多个有序区,每两个有序区进行两两比较归并复制形成新的有序区,直到合成一个有序区。

(1) 将R1-Rn数组分为n个有序区,每个有序区只有一个元素。R1和R2比较归并,R3和R4比较归并……

(2) 将[R1, R2]和[R3, R4]归并,将[R5, R6]和[R7, R8]归并,直到归并为一个有序区,排序完成。

 

分配排序

 

箱排序(桶排序)

箱排序适用于关键字少,且有大量重复记录的数组排序。

(1) 以待排序数组关键字为索引,建立桶;

(2) 将待排序的数组元素按照关键字放入桶内;

(3) 将不为空的桶首尾相接,排序完成。

 

基数排序

基数排序时对箱排序的改进,可有效减少桶数量。基数排序将数组的排序算法分解为比较规则1和比较规则2,只有同时满足规则1和2才算排序完成。

(1) 按比较规则1建立桶序列1,将数组元素放置入内;

(2) 按比较规则2建立桶序列2,从桶序列1中顺序取出数组元素,放置入内;

(3) 将桶序列2中的所有数组元素首尾相连,排序完成。

 

外部排序


当内存不足以满足内部排序的空间要求时,可将排序中间结果存放在硬盘中,即为外部排序。外部排序一般使用归并排序算法。

原创粉丝点击