归并排序
思路:假设初始序列含有n个记录,可以看成n个有序的子序列,每个子序列的而长度为l,然后把每i(i>=2)个子序列归并,得到n/i个长度为i的有序子序列,再继续归并,如此重复直到得到一个长度为n的有序序列为止。这种排序方法称为i路归并排序。在内部排序中,通常是采用2路归并排序。
程序代码:
void Merge(Elem temp[],Elem R[],int low,int mid,int high) //将temp中的两个有序子序列归并到R中
{
for(i = low,j = mid+1,k = low;i <= mid && j <= high;k++)
{
if(temp[i] < temp[j])
R[k] = temp[i++];
else
R[k] = temp[j++];
}
if(i <= mid)
R[k,---,high] = temp[i,---,mid];
if(j <= high)
R[k,---,high] = temp[j,---,high];
}
void MSort(Elem R1[],Elem R2[],int low,int high)
{
if(low == high)
R2[low] =R1[low];
else
{
mid = (low+high)/2;
MSort(R1,temp,low,mid); //递归的将R1[low,---,mid]归并为有序的temp[low,---,mid]
MSort(R1,temp,mid+1,high); //递归的将R1[mid+1,---,high]归并为有序的temp[mid+1,---,high]
Merge(temp,R1,low,mid,high); //将temp[low,---,mid]和temp[mid+1,---,high]归并到R1
}
}
void MergeSort(Elem R,int n)
{
MSort(R,R,1,n); //对R[1,---,n]进行2路归并排序
}
时间复杂度:O(nlogn),即:每一趟归并的时间复杂度为O(n),总共需logn(取上界)趟。
稳定性:稳定。