/***************************************************/
/* Description:四、递归并排序(C语言源代码)
/* Date:2021/9/18
/* Author:汝南城
/****************************************************/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
/*排序算法基于的顺序表存储结构*/
typedef int KeyType;
typedef struct {
int key;
char name[10];//other info
}RedType;
typedef struct {
RedType r[MAXSIZE + 1];
int length;
}SqList;
/*①合并两个相邻的有序序列*/
void Merge(RedType R[], RedType T[], int low, int mid,int high)
{
int i = low; int j = mid + 1; int k = low;
while (i <= mid && j <= high)
{
if (R[i].key < R[j].key)
T[k++] = R[i++];
else
T[k++] = R[j++];
}
while(i<=mid)T[k++] = R[i++];
while(j<=high)T[k++] = R[j++];
}
/*②2路递归归并排序将 R[low.. high]中的记录归并排序后放入 T[low.. high]中*/
void Msort(RedType R[], RedType T[], int low, int high)
{
RedType S[11];
if (low == high)
T[low] = R[low]; /*当长度为1时,递归结束*/
else
{
int mid = (low + high) / 2;
Msort(R,S,low,mid); /*对子序列 R[low.. mid]递归归并排序, 结果放入S[low .. mid]*/
Msort(R,S, mid+1, high); /*对子序列 R[mid+1.. high]递归归并排序, 结果放入S[mid+1.. high]*/
Merge(S,T,low,mid,high); /*将S[low ..mid]和S[mid + l..high]归并到 T[low ..high]*/
}
}
void MergeSort(SqList* L, RedType T[])
{
Msort(L->r,T,1,L->length);
}
void main()
{
SqList* L1 = (SqList*)malloc(sizeof(SqList));
RedType T[11];
RedType i;
L1->length = 0;
for (i.key = 100; i.key > 90; i.key--)
{
L1->r[101 - i.key].key = i.key;
L1->length++;
}
for (int j = 1; j <= 10; j++)
{
printf("%d ", L1->r[j].key);
}
printf("\n");
MergeSort(L1, T);
for (int j = 1; j <= 10; ++j)
{
printf("%d ", T[j].key);
}
}