数据结构课程中的归并排序算法介绍。
归并排序算法:
思想:首先,将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;
}
测试结果: