归并排序时间复杂度优于上述排序 。
归并排序的原理
归并排序算法的实现
(1)设3个指针,左侧值针,右侧指针,结果(指向归并数据)。
(2)将小的元素放到结果指针。
(3)结果指针和右侧指针右移
(4)重复上述步骤
void Merge (Rcd R[], int low, int mid, int high)
{
//将左侧R[low..mid]与右侧R[mid+1..high]归并到全局数组T[low..high]再写回R
P_left=low; //左侧左边界
P_right=mid+1;//右侧左边界
P_result=low;//存放归并数组的第一个空闲位置
while(P_left<=mid &&P_right<=high ) //两者都不超过边界
{
if(R[P_left]<R[P_right])
{
T[P_result]=R[P_left];//存储数据
P_result++;
P_left++; //指针后移
}
else
{
T[P_result]=R[P_right];
P_result++;
P_right++;
}
}
//将剩余元素填入目标数组右侧
if(P_left<=mid)
do
{
T[P_result]=R[P_left];
P_result++;
P_left++;
}
while(P_left<=mid );
else
do
{
T[P_result]=R[P_right];
P_result++;
P_right++;
}
while(P_right<=high );
}
void MSort( Rcd R[], int low, int high, Rcd &T[]){
//对R[low..high]进行归并排序,结果存入T[low..high]
if( low == high ) T[low]=R[low]; //递归边界
else{
mid=(low+high)/2;
MSort(R, low , mid, S); //左侧递归
MSort(R, mid+1, high, S);//右侧递归
Merge(S, low, mid, high, T); //归并
}
}
Rcd S[N]; void main(){… ; Msort(R,1,N,R); …}
算法分析
归并排序的时间复杂度为O(nlog2n),其中n是待排序元素的数量。最好最坏都一样。
归并排序的空间复杂度为S(n)=O(n)