从今天开始,我就要学习写伪代码了。都说实践是最好的老师,所以我希望通过对算法的描述来学习伪代码。
百度百科上介绍,伪码(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就被排好序了,其他不是数组的实现也是类似的。