归并排序求解
第一行一个数字n,代表输入的组数其后每组第一行输入一个数字m,代表待排序数字的个数
其后m行每行一个数据,大小在1~100000之间,互不相等,最多有10万个数据。
输出
升序输出排好序的数据,每行一个数字
样例输入
1
10
10
9
8
7
6
5
4
3
2
1
样例输出
1
2
3
4
5
6
7
8
9
10
不知道大家对此题有没有好的解法,供我参考。我原来的程序在vc上运行不了。
#include <stdio.h> #define MAXSIZE 100000 /* 用于要排序数组个数最大值,可根据需要修改 */ typedef struct { int r[MAXSIZE+1]; /* 用于存储要排序数组,r[0]用作哨兵或临时变量 */ int length; /* 用于记录顺序表的长度 */ }SqList; void print(SqList L) { int i; for(i = 1; i < L.length; i++) printf("%d\n", L.r[i]); printf("%d\n", L.r[i]); } void Merge(int SR[], int TR[], int i, int m, int n) { int j, k, l; for(j = m + 1, k = i; i <= m && j <= n; k++) /* 将SR中记录由小到大地并入TR */ { if (SR[i] < SR[j]) TR[k] = SR[i++]; else TR[k] = SR[j++]; } if(i <= m) { for(l = 0;l <= m - i; l++) TR[k + l] = SR[i + l]; /* 将剩余的SR[i..m]复制到TR */ } if(j <= n) { for(l = 0; l <= n - j; l++) TR[k + l] = SR[j + l]; /* 将剩余的SR[j..n]复制到TR */ } } void MSort(int SR[],int TR1[],int s, int t) { int m; int TR2[MAXSIZE + 1]; if(s == t) TR1[s] = SR[s]; else { m = (s + t) / 2; MSort(SR, TR2, s, m); MSort(SR, TR2, m+1, t); Merge(TR2, TR1, s, m, t); } } void MergeSort(SqList *L) { MSort(L->r, L->r, 1, L->length); } int main(void) { int i; SqList L; for (i = 0; i < 10; ++i) { L.r[i] = 10 - i; } L.length = 10; MergeSort(&L); print(L); return 0; }