| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 402 人关注过本帖
标题:归并排序求解
只看楼主 加入收藏
yshx88
Rank: 2
等 级:论坛游民
帖 子:57
专家分:68
注 册:2013-10-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
归并排序求解
第一行一个数字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上运行不了。
2013-10-29 21:27
todayzjs
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:30
专家分:121
注 册:2013-7-1
收藏
得分:20 
老实说我不是特别理解lz的开头那两句话,不过,貌似就是有关输入和创建数组的问题。
那样的问题,lz自己应该解决。
这是我写的归并排序,排序方法写好了,其他的,lz自己去完善吧。
程序代码:
#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;
}

2013-10-30 15:35
yshx88
Rank: 2
等 级:论坛游民
帖 子:57
专家分:68
注 册:2013-10-20
收藏
得分:0 
前两行大致说:输入一个数n代表有n组测试数据,然后每组有m个数需要排序,每个数占一行,有m行

我的世界每天开出一朵花
2013-10-30 22:05
yshx88
Rank: 2
等 级:论坛游民
帖 子:57
专家分:68
注 册:2013-10-20
收藏
得分:0 
感觉好麻烦,数据结构都用上了,不知道你使用的什么编译器,能运行成功吗

我的世界每天开出一朵花
2013-10-30 22:17
todayzjs
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:30
专家分:121
注 册:2013-7-1
收藏
得分:0 
我用的ubuntu,gcc,只用到了C的标准文件#include <stdio.h>,因此不存在编译器差异的问题,
运行是成功的。只是,我用的待排序的数组很简单。
归并排序算是高级排序算法,不像冒泡,直接插入法那样简单。
我是将每一部分都分开了,要是一股脑的在一个函数里面,我自己看得头都大,lz先了解一下归并算法,理解了步骤,再看这个代码,会好看一点。
像希尔排序,堆排序,归并排序,还有超级经典的快速排序,不是一时半会理解透彻的,lz要静下心来。
九个比较重要的排序算法,lz还是自己整理一下。
print()函数很简单,就是打印数据。
MSort()函数, 将SR[s..t]归并排序为TR1[s..t]
Merge()函数, 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
MergeSort()函数,对顺序表L作归并排序。
这样解释能清楚点了不?

2013-10-31 15:16
快速回复:归并排序求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018592 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved