数据结构之归并排序,C++实现

蛟龙-_- 2011-06-24 07:50:26
下面是我写的用归并排序给20000个数排序,但是到调用函数时,就显示xxx.exe已停止工作,难道是要排序的数太多了?哪位高手给看看是怎么回事,谢谢了。
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<iomanip>
using namespace std;
#define MAXSIZE 20000
typedef struct{
int key;
}RedType;
typedef struct{
RedType r[MAXSIZE+1];
int length;
}Sqlist;

void Merge (RedType SR[],RedType TR[],int i,int m,int n)
{
int j,k;
for (j=m+1,k=i;i<=m&&j<=n;++k)
{
if(SR[i].key<SR[j].key) TR[k]=SR[i++];
else TR[k]=SR[j++];
}
if (i<=m)
while (k<=n&&i<=m) TR[k++]=SR[i++];
if (j<=n)
while (k<=n&&j<=n) TR[k++]=SR[j++];
}
void MSort(RedType SR[], RedType TR1[], int s, int t)
{
int m;
RedType TR2[20000];
if (s==t) TR1[t] = SR[s];
else {
m=(s+t)/2; // 将SR[s..t]平分为SR[s..m]和SR[m+1..t]
MSort(SR,TR2,s,m); // 递归地将SR[s..m]归并为有序的TR2[s..m]
MSort(SR,TR2,m+1,t); // 将SR[m+1..t]归并为有序的TR2[m+1..t]
Merge(TR2,TR1,s,m,t); // 将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t]
}
}

void main()
{
int i,a[20001];
cout<<"\\(^o^)/产生20000随机数过程\\(^o^)/"<<endl;
srand((unsigned)time(NULL));
for(i=1;i<20001;i++)
a[i]=rand()%32768;
system("pause");
for(i=1;i<20001;i++)
{
cout<<setw(6)<<a[i]<<" ";
if(i%10==0) cout<<endl;
}
Sqlist L;
L.length=0;
for(i=1;i<20001;i++)
{
L.r[i].key=a[i];
L.length++;
}
system("pause");
cout<<"Breaking Line Here......"<<endl;
MSort(L.r, L.r, 1, L.length);
for(i=1;i<20001;i++)
{
cout<<setw(6)<<L.r[i].key<<" ";
if(i%10==0) cout<<endl;
}
}
...全文
520 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
Oh!Shirt! I make it! but waste much time!
  • 打赏
  • 举报
回复
网上基本上都是“RedType *TR2 = new RedType[ 10 ]”的做法!
  • 打赏
  • 举报
回复
这位仁兄,如果要对这么多的数据进行,递归的方法是肯定会溢出的!但可以采用非递归的方式来完成!
顺便问各位豪杰一下哦,针对“RedType TR2[20000];”这一句,我如果想用动态申请的方式来处理(申请10个以下的空间):当我用RedType *TR2 = new RedType[ 10 ]OK,但当我RedType *TR2 = new RedType[ a ] (a<=10)是却发生错误,具体错误是当第一执行Merge(TR2,TR1,s,m,t); 后delete []TR2出错,调试了好久,仍不知为什么,期望高人指点!
zjs100901 2011-06-24
  • 打赏
  • 举报
回复
递归函数里你还想每层RedType TR2[20000];不溢出才怪。
默认好像栈只有1M还是几兆吧。
zjs100901 2011-06-24
  • 打赏
  • 举报
回复
栈溢出了,静态数组定义太大了,改用new吧。
蛟龙-_- 2011-06-24
  • 打赏
  • 举报
回复
嗯,是的,谢谢各位,问题已解决
GARY 2011-06-24
  • 打赏
  • 举报
回复
RedType* TR2 = new RedType[20000];
动态申请数组时使用operator new[] (array new操作符)
不是new()
new RedType(20000);
是用20000初始化变量RedType。
ryfdizuo 2011-06-24
  • 打赏
  • 举报
回复
TR2=new RedType[20000];
new圆括号是只new了一个,而且初始化
中括号是表示个数
蛟龙-_- 2011-06-24
  • 打赏
  • 举报
回复
RedType* TR2;
TR2=new RedType(20000);
这样可以么?
编译这样报错:C:\VC6\MyProjects\da6241\1350.cpp(32) : error C2664: '__thiscall RedType::RedType(const RedType &)' : cannot convert parameter 1 from 'const int' to 'const RedType &'
蛟龙-_- 2011-06-24
  • 打赏
  • 举报
回复
哦,原来如此,我说怎么每次都程序意外结束,谢谢啦

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧