在归并排序的迭代算法中,可以把输入看成是n个已排列序列,其中每个序列的长度为1。将这些序列两两归并就可以得到n/2个长度为2的序列(若n为奇数,则还有一个长度为1的序列)。对这n/2个序列进行两两归并,依此类推,直到只剩下一个序列为止。
归并排序的迭代算法可以如下实现:
#define MAX_SIZE 200
void merge(int list[],int sorted[],int i,int m,int n)
{
/* merge two sorted files:list[i]...list[m] and
list[m+1]...list[n]. These files are sorted to
obtain a sorted list: sorted[i]...sorted[n]*/
int j,k,t;
j = m + 1;
k = i;
while (i<=m && j<=n)
{
if (list[i]<=list[j])
sorted[k++] = list[i++];
else
sorted[k++] = list[j++];
}
if(i>m)
/*sorted[k],...,sorted[n] = list[j],...,list[n]*/
for(t=j;t<=n;t++)
sorted[k+t-j] = list[t];
else
/*sorted[k],...,sorted[n] = list[i],...,list[m]*/
for (t=i;t<=m;t++)
sorted[k+t-i] = list[t];
}
void mergePass(int list[],int sorted[],int n,int length)
{
/* perform one pass of the merge sort. It merges adjacent
pairs of subfiles from list into sorted. n is the number
of elements in the list. length is the length of the subfile
*/
int i,j;
for (i=0;i<=n-2*length;i+=2*length)
merge(list,sorted,i,i+length-1,i+2*length-1);
if(i+length<n)
merge(list,sorted,i,i+length-1,n-1);
else
for(j=i;j<n;j++)
sorted[j] = list[j];
}
void mergeSort(int list[],int n)
{
/* n is the length of list.*/
int length = 1;
int extra[MAX_SIZE];
while(length<n)
{
mergePass(list,extra,n,length);
length *= 2;
mergePass(extra,list,n,length);
length *= 2;
}
}
测试程序:
void main()
{
int a[10];
srand((unsigned)time(NULL));
for(int i=0;i<10;i++)
cout<<(a[i] = rand() % (50 + 1))<<' ';
cout<<endl;
mergeSort(a,10);
for(int i=0;i<10;i++)
cout<<a[i]<<' ';
cout<<'\n';
}