归并排序求解
第一行一个数字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;
}