数据结构课程中的归并排序算法介绍。
归并排序算法:
思想:首先,将a[o,1,2...n-1]看成是n个长度为1的有序表,将相邻的有序表成对归并,得到n/2个长度为2的有序表;然后,再将这些有序表成对归并,得到n/4个长度为4的有序表,如此反复进行下去,最后得到一个长度为n的有序表,这样排序结束。
算法:在实现归并排序时,通常是先实现一个将两个有序表归并为一个有序表的算法Merge(),然后对各趟进行归并,最终直到归并结束。
<span style="font-size:14px;">//二路归并 void Merge(int a[],int low,int mid,int high) { int i=low,j=mid+1,k=0; int b[high-low+1]; while(i<=mid&&j<=high) { if(a[i]<a[j]) { b[k]=a[i]; i++;k++; } else { b[k]=a[j]; j++;k++; } } while(i<=mid) { b[k]=a[i]; i++;k++; } while(j<=high) { b[k]=a[j]; j++;k++; } for(k=0,i=low;k<high-low+1;k++,i++) a[i]=b[k]; } //单趟处理 void MergePass(int a[],int length,int n) { int i; for(i=0;i+2*length-1<n;i=i+2*length) //归并长度为length的偶数对 Merge(a,i,i+length-1,i+2*length-1); if(i+length-1<n) //处理最后一个偶数对不为2*length时 Merge(a,i,i+length-1,n-1); //奇数个length单位,最后一个轮空 } //归并排序 void MergeSort(int a[],int n) { int length; for(length=1;length<n;length=2*length) MergePass(a,length,n); } </span>
总结:归并算法产生的有序区不一定是全局有序的,相关性能如下:
最后关于算法的测试:
/*归并排序算法*/ #include <iostream> using namespace std; //二路归并 void Merge(int a[],int low,int mid,int high) { int i=low,j=mid+1,k=0; int b[high-low+1]; while(i<=mid&&j<=high) { if(a[i]<a[j]) { b[k]=a[i]; i++;k++; } else { b[k]=a[j]; j++;k++; } } while(i<=mid) { b[k]=a[i]; i++;k++; } while(j<=high) { b[k]=a[j]; j++;k++; } for(k=0,i=low;k<high-low+1;k++,i++) a[i]=b[k]; } //单趟处理 void MergePass(int a[],int length,int n) { int i; for(i=0;i+2*length-1<n;i=i+2*length) //归并长度为length的偶数对 Merge(a,i,i+length-1,i+2*length-1); if(i+length-1<n) //处理最后一个偶数对不为2*length时 Merge(a,i,i+length-1,n-1); //奇数个length单位,最后一个轮空 } //归并排序 void MergeSort(int a[],int n) { int length; for(length=1;length<n;length=2*length) MergePass(a,length,n); } //测试函数 int main() { int a[10]={144,232,111,678,329,834,123,230,567,431}; cout<<"排序之前的数组元素为:"; for(int i=0;i<10;i++) cout<<a[i]<<" "; cout<<endl; MergeSort(a,10); cout<<"排序之后的数组元素为:"; for(int i=0;i<10;i++) cout<<a[i]<<" "; cout<<endl; }测试结果: