一张图看懂
归并的定义:将两个或两个以上的有序表组合成新的有序表
#include "stdio.h"
#include "malloc.h"
#include <string.h>
#include<cstdlib>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef struct {//一个简单的线性链表结构
int *Data;//线性链表的初址
int length;
}SqList;
/*线性链表初始化函数*/
Status InitSqList(SqList *S) {
int n,i;
printf("请输入需排序的数据个数:\n");
scanf("%d", &n);
getchar();//吸收换行符
S->length = n;
S->Data = (int*)malloc((n + 1)*sizeof(int));
if (!S->Data)return ERROR;
S->Data[0] = 0;//编写排序程序的小习惯(设立哨兵位,用于插入排序)
for ( i = 1; i <= n; i++) {
printf("第%d个数为:", i);
scanf("%d", &S->Data[i]);
getchar();//吸收换行符
}
return OK;
}
/*归并排序的归并函数*/
void Merge(int SR[], int TR[], int i, int middle, int rightend) {//实际上这里的i也就是要排序合并的数组段的左起始点
int j, k, l;
for (k = i, j = middle + 1; i <= middle&&j <= rightend; k++) {
if (SR[i] < SR[j])/*将SR中的元素按小到大的顺序存入TR,只需比较中点两侧对应下标元素大小*/
TR[k] = SR[i++];
else
TR[k] = SR[j++];
}
if (i <= middle) {/*若中点左边元素剩余,将剩余元素并入TR(注意这里并入只要按照顺序即可,因为SR已经排好序了)*/
for (l = 0; l <= middle - i; l++)
TR[k + l] = SR[i + l];
}
if (j <= rightend) {/*若中点右边元素剩余,将剩余元素并入TR*/
for (l = 0; l <= rightend - j; l++)
TR[k + l] = SR[j + l];
}
}
/*归并排序递归函数*/
void MSort(int SR[], int TR1[], int s, int t) {
int middle;
int TR2[MAXSIZE + 1];
if (s == t)
TR1[s] = SR[s];
else {
middle = (s + t) / 2;/*将SR分成以middle为界的两部分*/
MSort(SR, TR2, s, middle);/*递归将SR[s,middle]归并为有序的数组TR2*/
MSort(SR, TR2, middle + 1, t);/*递归将SR[middle+1,t]归并为有序的数组TR2*/
Merge(TR2, TR1, s, middle, t);/*将上面的两部分分别有序的TR2归并为总体有序的TR1*/
}
}
/*总体调用排序函数*/
void MergeSort(SqList *S) {
MSort(S->Data, S->Data, 1, S->length);
}
int main()
{
SqList S;
int i;
InitSqList(&S);
MergeSort(&S);
printf("\n");
for ( i = 1; i <= S.length; i++){
printf("第%d个数为\t%d\n", i, S.Data[i]);
}
system("pause");
return 0;
}