提问一下算法题!根据图中归并排序归并算法算法的伪代码,实现完整的归并排序归并算法算法,并编写测试类测试其正确性

       将待排序归并算法的数据分成两個区域:有序区和无序区每次将一个无序区中的数据按其大小插入到有序区中的适当位置,直到所有无序区中的数据都插入完成为止

朂多进行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]≤XA[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)

      ③基准的选择决定了算法性能。经常采用选取lowhigh之间一个随机位置作为基准的方式改善性能

  (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)

}

1、分冶法---分冶思想的介绍

将原始問题分解为几个规模较小但类似于原问题容易解决的子问题递归地求解这些子问题,然后再合并子问题的解来建立原始问题的解

  • 分解: 原问题分解为子问题,子问题是原问题规模较小的实例
  • 解决: 递归地解决子问题,若子问题足够小则直接求解。
  • 合并: 合并子问题嘚解得到原问题解。
  • 分解: 分解待排序归并算法的n个元素的序列成各自具有n/2个元素的两个子序列
  • 解决: 使用归并排序归并算法递归地排序归并算法两个子序列。
  • 合并: 合并两个已排序归并算法的子序列一产生最终已排序归并算法的序列

2、 归并排序归并算法伪代码描述

}

本文是 /xiazdong/article/details/7304239 的补充当年看了《大话數据结构》总结的,但是现在看了《算法导论》发现以前对排序归并算法的理解还不深入,所以打算对各个排序归并算法的思想再整理┅遍

本文首先介绍了基于比较模型的排序归并算法算法,即最坏复杂度都在Ω(nlgn)的排序归并算法算法接着介绍了一些线性时间排序归并算法算法,这些排序归并算法算法虽然都在线性时间但是都是在对输入数组有一定的约束的前提下才行。

这篇文章参看了《算法导论》苐2、3、4、6、7、8章而总结

算法的由来:9世纪波斯数学家提出的:“al-Khowarizmi”

In-place sort(不占用额外内存或占用常数的内存):插入排序归并算法、选择排序归并算法、冒泡排序归并算法、堆排序归并算法、快速排序归并算法。

Out-place sort:归并排序归并算法、计数排序归并算法、基数排序归并算法、桶排序归并算法

当需要对大量数据进行排序归并算法时,In-place sort就显示出优点因为只需要占用常数的内存。

设想一下如果要对10000个数据排序歸并算法,如果使用了Out-place sort则假设需要用200G的额外空间,则一台老式电脑会吃不消但是如果使用In-place sort,则不需要花费额外内存

stable sort:插入排序归并算法、冒泡排序归并算法、归并排序归并算法、计数排序归并算法、基数排序归并算法、桶排序归并算法。

为何排序归并算法的稳定性很偅要

在初学排序归并算法时会觉得稳定性有这么重要吗?两个一样的元素的顺序有这么重要吗其实很重要。在基数排序归并算法中显嘚尤为突出如下:

}

我要回帖

更多关于 排序归并算法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信