归并排序的迭代算法

来源:互联网 发布:淘宝补单平台 编辑:程序博客网 时间:2024/06/14 16:28

在归并排序的迭代算法中,可以把输入看成是n个已排列序列,其中每个序列的长度为1。将这些序列两两归并就可以得到n/2个长度为2的序列(若n为奇数,则还有一个长度为1的序列)。对这n/2个序列进行两两归并,依此类推,直到只剩下一个序列为止。

归并排序的迭代算法可以如下实现:

#define  MAX_SIZE  200void 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++];elsesorted[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 adjacentpairs of subfiles from list into sorted. n is the numberof 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);elsefor(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';}




0 0