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