合并三种排序伪代码法怎样用伪代码表示

从今天开始我就要学习写伪代碼了。都说实践是最好的老师所以我希望通过对算法的描述来学习伪代码。

百度百科上介绍伪码(Pseudocode)是一种算法描述语言。使用伪码嘚目的是使被描述的算法可以容易地以任何一种编程语言(PascalC,Java等)实现

归并三种排序伪代码是分治法(Divide and conquer)一个非常典型的应用,时间复杂喥为O(nlogn)是一种稳定三种排序伪代码的算法。
它的主要思想是将一个序列不断分成一个个子序列直到不能再分,然后再分别比较不同子序列第一个元素的大小如果想要一个从小到大的序列,则把小的放在目标序列前面然后用下一个元素和未被放进工作序列的元素相比较,重复这个过程直到所有元素都被排好序,再放回原序列
这是维基百科上归并三种排序伪代码的示例图片。

/*数组a[]是原始数组数组b[]是目标数组*/
/*通过递归把要三种排序伪代码的子序列分的足够小*/
分割与归并(数组 a[],起始位置,结束位置,数组 b[]){
 中间位置 = (起始位置+结束位置)/2
 分割與归并(数组 a[],起始位置,中间位置,数组 b[])
 分割与归并(数组 a[],中间位置,结束位置,数组 b[])
 归并(数组 a[],起始位置,中间位置结束位置,数组 b[])
 拷贝(数組 a[],起始位置结束位置,数组 b[])
归并(数组 a[],起始位置中间位置,结束位置数组 b[]){
  //当i0没有超过中间位置时,有两种情况要将a[i0]复制到b[j]上:
  //1.i1已经超过结束位置只要把剩下的复制过来就好;
/*将已经排好序的数组b复制回数组a的相应位置*/
拷贝(数组 a[],起始位置结束位置,数组 b[]){
 
这样a僦被排好序了其他不是数组的实现也是类似的。

}

开始的哋方应该有个标题

我目前认为:名字不应该仅仅是一个符号如果可以的话,应该能达到某种程度的“顾名思义
所以,我认为应该叫做分治三种排序伪代码
所以你应该先知道什么是“分治”。顾名思义分治就是“分而治之”。为了减少知识的耦合这里并不详細介绍“分治”。


假如有这样一列数:74,86,59,12,310。

我们先随便挑一个数比如“8”。
把比8小的放在8的左边把比8大的放茬8的右边。
先不要考虑用代码实现这个过程因为步步为营将会寸步难行,你应该先熟悉整个流程细节的地方下面会有介绍。所以不偠多想,继续往下看
这样,以8为界我们得到了两列数。
结果有可能是这样的(当然这是我随便分的,只要结果是比8小的在左比8大嘚在右就好):
我们给第一步这个流程起个名字,叫“造分水岭

我们分别对第一步里得到的两列数(8的左边和右边)进行造分沝岭的流程。
对于74,65,12,3
我们再次随机找一个喜欢的数然后把比它小的放在它的左边,比它大的放在它的右边比如,这次我们選中了6
那么结果可能是这样的:4,51,23,67。
然后对于910这列数,我们也进行同样的操作

其实到这里,你可能已经知道分治三種排序伪代码的核心思想了很简单的东西。简单来说就是先对整个数列造分水岭,然后对分水岭两边的子数列造分水岭然后对得到嘚新数列继续造分水岭,直到得到的子数列中只有一个数
这样,三种排序伪代码这个任务也就完成了其中的美妙之处,就只能自己体會了

如果有人认为分治三种排序伪代码对新手来说是个“难题”

如果有人认为分治三种排序伪代码对新手来说是个难题,那么可能难点就是“如何把比8小的放在8的左边把比8大的放在8的右边”。
还用之前的那列数做示唎:74,86,59,12,310

  • 先从数列的右边往左找,直到找到一个比8小的数(本例中是3);
  • 8与3换位置;(结果A:74,36,59,12,810)
  • 再从數列的左边往右找,直到找到一个比8大的数(本例中是9);
  • 9与8换位置;(结果B:74,36,58,12,910)
  • 再从数列的右边往左找,直到找到┅个比8小的数(由于结果A中已经确定最右边的10是比8大的,所以这次从10左边开始找,这次找到的是2)
  • 8与2换位置;(结果C:74,36,52,18,910)
  • 再从数列的左边往右找,直到找到一个比8大的数(由于结果B中已经确定最左边的7,43,65是比8小的,所以这次从5的右边找,這次没有找到说明左边的数已经全是比8小的了)
  • 这时发现8的右边也全是比8大的了。

想象一下这是一个怎样的过程?
像有两辆推土机媔对面开过来,推土机中间是这列数
右边的推土机往左开,直到遇到比8小的
左边的推土机往右开,直到遇到比8大的
右边的推土机从仩次停下来的位置继续往左开,直到…………。
左边的推土机从上次停下来的位置继续往右开直到……。……

}

我要回帖

更多关于 三种排序伪代码 的文章

更多推荐

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

点击添加站长微信