归并排序的基本思想
void MSort(SqList* L, RedType* T, int left, int right)
{
//中间位置
int mid;
//只有一个元素的区域,本身就是有序的,返回上层递归,准备合并
if (left < right)
{
mid = (left + right) / 2;
//递归划分左半部分
MSort(L, T, left, mid);
//递归划分右半部分
MSort(L, T, mid + 1, right);
//合并已经排序的部分
Merge(L, T, left, mid, right);
}
}
演示程序执行过程
mid = 4
递归左部分
MSort(L,T,0,4)
0 1 2 3 4 5 6 7 8
9 5 2 7 12 4 3 1 11
mid = 2
递归左部分
MSort(L,T,0,2)
0 1 2 3 4
9 5 2 7 12
mid = 1
递归左部分
MSort(L,T,0,1)
0 1 2
9 5 2
mid = 0
递归左部分
MSort(L,T,0,0)
0 1
9 5
if (left < right) 为假
返回到这
0 1
9 5
mid = 0
递归右部分
MSort(L,T,1,1)
if (left < right) 为假
返回到这
0 1
9 5
左右部分递归完成
合并左、右部分
Merge(L, T, left, mid, right);
递归返回
mid = 1
递归右部分
MSort(L,T,2,2)
0 1 2
5 9 2
if (left < right) 为假
Merge(L, T, left, mid, right);
递归返回
mid = 2
递归右部分
MSort(L,T,3,4)
0 1 2 3 4
2 5 9 7 12
mid = 3
递归左部分
MSort(L,T,3,3)
3 4
7 12
if (left < right) 为假
递归返回
3 4
7 12
mid = 3
递归右部分
MSort(L,T,4,4)
if (left < right) 为假
递归返回
3 4
7 12
Merge(L, T, left, mid, right);
递归返回
左右半区递归完成
0 1 2 3 4
2 5 9 7 12
Merge(L, T, left, mid, right);
0 1 2 3 4
2 5 7 9 12
递归返回
0 1 2 3 4 5 6 7 8
2 5 7 9 12 4 3 1 11
后部分流程相同,就不演示了