归并排序
1.基础理解
- 基本思想:将两个或两个以上的有序子序列“归并”为一个有序序列。
- 在内部排序中,通常采用的是 2-路归并排序 --------即将两个位置相邻的有序子序列 R[l…m] 和 R[m+1…n] 贵宾房为一个有序序列 R[l…n]
2.算法实现
将两个有序的子系列归并为一个序列
//将 R[low...mid],R[mid...high]归并为有序表T[low...high]
void Merge(int *R,int *T,int low,int mid,int high)
{
int i = low;
int j = mid+1;
int k = low;
//将 R 中的记录从小到大并入 T 中
while(i <= mid && j <= high)
{
if(R[i].key <= R[j].key)
{
T[k] = R[i++];
k++;
}
else
{
T[k] = R[j++];
k++;
}
}
//当其中一个子序列已经比较完时
while(i <= mid)
{
T[K++] = R[i++];
}
while(j <= high)
{
T[K++] = R[j++];
}
}
//将当前序列一分为二
void Msort(int *R,int *T,int loe,int high)
{
int S[MAXSIZE];
if(low == high)
{
T[low] = T[high];
}
else
{
mid = (low + high)/2;
Msort(R,S,low,high);//对子序列 R[low...mid] 递归归并排序,结果放入 S[low...mid]
Msort(R,S,mid+1,high);//对子序列 R[mid...high] 递归归并排序,结果放入 S[mid...high]
Merge(S,T,low,mid,high);//将S[low...mid]和S[mid...high]归并到 T
}
}
//对顺序表 L 归并排序
void Mergesort(Sqlist *L)
{
Msort(L->r,L->r,1,L->length);
}
利用图示理解Msort函数的递归