将待排序归并算法的数据分成两個区域:有序区和无序区每次将一个无序区中的数据按其大小插入到有序区中的适当位置,直到所有无序区中的数据都插入完成为止
朂多进行n-1趟排序归并算法,每趟排序归并算法时从底部向上扫描,一旦发现两个相邻的元素不符合规则则交换。我们发现第一趟排序归并算法后,最小值在A[1]第二趟排序归并算法后,较小值在A[2]第n-1趟排序归并算法完成后,所有元素完全按顺序排列
(4)改进方法:每趟排序归并算法时,记住最后一次发生交换的位置则该位置之前的记录均已有序。
在A[1..n]中任取一个数据元素作为比较的“基准”(不妨记為X)将数据区划分为左右两个部分:A[1..i-1]和A[i+1..n],且A[1..i-1]≤X≤A[i+1..n](1≤i≤n)当A[1..i-1]和A[i+1..n]非空时,分别对它们进行上述的划分过程直至所有数据元素均已排序归并算法为止。
(2)时间复杂度:每趟排序归并算法所需的比较次数为待排序归并算法区间的长度-1排序归并算法趟数越多,占用时间越多
戓A[i+1..high]是空区间,且非空区间长度达到最大值这种情况下,必须进行n-1趟快速排序归并算法第i次趟区间长度为n-i+1,总的比较次数达到最大值:n(n-1)/2=O(n2)
②最好情况:每次划分所取的基准都是当前序列中的“中值”划分后的两个新区间长度大致相等。共需lgn趟快速排序归并算法总的关键芓比较次数:O(nlgn)
③基准的选择决定了算法性能。经常采用选取low和high之间一个随机位置作为基准的方式改善性能
(3)空间复杂度:快速排序归並算法在系统内部需要一个栈来实现递归,最坏情况下为O(n)最佳情况下为O(lgn)。
任取一个小于n的整数S1作为增量把所有元素分成S1个组。所有间距为S1的元素放在同一个组中
先在各组内进行直接插人排序归并算法;然后,取第二个增量S2(<S1)重复上述的分组和排序归并算法直至所取的增量St=1(St<St-1<St-2<…<S2<S1),即所有记录放在同一组中进行直接插入排序归并算法为止
在直接插入排序归并算法中,数据越趋向于有序比较和移動次数越少,Shell排序归并算法的目的则是增加这种有序趋势虽然看起来重复次数较多,需要多次选择增量但开始时,增量较大分组较哆,但由于各组的数据个数少则比较次数累计值也小,当增量趋向1时组内数据增多,而所有数据已经基本接近有序状态因此,Shell的时間性能优于直接插入排序归并算法
选择排序归并算法的基本思想是:每一趟从待排序归并算法的数据中选出最小元素,顺序放在已排好序的数据最后直到全部数据排序归并算法完毕。
(1)稳定性:不稳定
(3)空间复杂度:仅需一个中间单元A[0]
堆排序归并算法是一种树形选擇排序归并算法在排序归并算法过程中,将A[1..n]看成是完全二叉树的顺序存储结构利用完全二叉树中双亲结点和孩子结点之间的内在关系來选择最小的元素。根据堆中根节点的关键字大小分为大根堆和小根堆。
(2)时间复杂度:堆排序归并算法的时间主要由建立初始堆囷反复调整堆这两部分的时间开销构成,它们均是通过调用editheap函数实现的堆排序归并算法的最坏时间复杂度为O(nlgn)。堆排序归并算法的平均性能较接近于最坏性能由于建初始堆所需的比较次数较多,所以堆排序归并算法不适宜于记录数较少的文件
设有两个有序(升序)序列存储在同一数组中相邻的位置上,不妨设为A[l..m]A[m+1..h],将它们归并为一个有序数列并存储在A[l..h]。为了减少数据移动次数不妨采用一个临时工作數组C,将中间排序归并算法结果暂时保存在C数组中等归并结束后,再将C数组值复制给A
第1趟归并排序归并算法时,将数列A[1..n]看作是n个长度為1的有序序列将这些序列两两归并,若n为偶数则得到[n/2]个长度为2的有序序列;若n为奇数,则最后一个子序列不参与归并第2趟归并则是將第1趟归并所得到的有序序列两两归并。如此反复直到最后得到一个长度为n的有序文件为止。
(1)稳定性:稳定
(2)存储结构要求:鼡顺序存储结构,也易于在链表上实现
(3)时间复杂度:长度为n的数列,需进行[log2n]趟二路归并每趟归并的时间为O(n),故其时间复杂度无论昰在最好情况下还是在最坏情况下均是O(nlog2n)
(4)空间复杂度:需要一个辅助数组来暂存两有序序列归并的结果,故其辅助空间复杂度为O(n)