伪代码描述归并排序算法

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

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

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

具体实现如下

/*数组a[]是原始数组,数组b[]是目标数组*/
归并排序(数组 a[],数组 b[]){
    `分割与归并(数组 a[],0, a.length,数组 b[])
}

/*通过递归把要排序的子序列分的足够小*/
分割与归并(数组 a[],起始位置,结束位置,数组 b[]){
    if(结束位置 - 起始位置 < 2)
        返回
    中间位置 = (起始位置+结束位置)/2
    分割与归并(数组 a[],起始位置,中间位置,数组 b[])
    分割与归并(数组 a[],中间位置,结束位置,数组 b[])
    归并(数组 a[],起始位置,中间位置,结束位置,数组 b[])
    拷贝(数组 a[],起始位置,结束位置,数组 b[])
}

归并(数组 a[],起始位置,中间位置,结束位置,数组 b[]){
    i0 = 起始位置,i1 = 中间位置

    for j = 起始位置 到 结束位置
        if(i0 < 中间位置 且 (i1 > 结束位置 或 a[i0] <= a[i1]){
            //当i0没有超过中间位置时,有两种情况要将a[i0]复制到b[j]上:
            //1.i1已经超过结束位置,只要把剩下的复制过来就好;
            //2.a[i0]比a[i1]小
            b[j]=a[i0]
            i0++
        } else {
            b[j]=a[i1]
            i1++
        }

}

/*将已经排好序的数组b复制回数组a的相应位置*/
拷贝(数组 a[],起始位置,结束位置,数组 b[]){
    for k = 起始位置 到 结束位置
        a[k] = b[k]
}

这样a就被排好序了,其他不是数组的实现也是类似的。

    原文作者:排序算法
    原文地址: https://blog.csdn.net/java_xiaoer/article/details/48716639
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞