快速排序 的奇怪问题

after_sss 2007-10-13 03:03:55
就是用自己写的快速排序对数组排序,当只有QuickSort(a,0,bound-1);只排一次的时候,没任何问题,排2次或以上当数组元素大于8635的时候就不会出结果,小于它正常,主要是我要用clock()来计算算法效率,要对排序循环多次才能出来毫秒数,才发现了这个问题,我同时比较了归并排序、等其他排序算法的效率,只有这个算法出问题,不知道为什么啊。
#include<iostream>
#include<time.h>
using namespace std;

const int bound=8635;//8635就不行了
void QuickSort(int *a,int p,int r);

int main()
{
int a[bound];
srand(time(0));
int j;
for(j=0;j<bound;j++)
{
a[j]=rand()%9999;
}
QuickSort(a,0,bound-1);//////////////////////////////////////
QuickSort(a,0,bound-1);
cout << "Finish!";
return 0;
}

void QuickSort(int *a,int p,int r)///快速排序
{
if(p>=r)
return;
int temp,i,j;
int p1=p;
int r1=r;

do
{
for(i=r1;i>p1;i--)
{
if(a[p1]>a[i])
{
temp=a[p1];
a[p1]=a[i];
a[i]=temp;
break;
}
}
for(j=p1+1;j<i;j++)
{
if(a[i]<a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
break;
}
}
r1=i;
p1=j;
}
while(i>j);

QuickSort(a,p,i-1);
QuickSort(a,i+1,r);
}

...全文
201 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaojinhai 2007-10-25
  • 打赏
  • 举报
回复
void Quick_Sort(int A[], int p ,int r)
{
if(p < r)
{
int q = Partition(A, p, r);
Quick_Sort(A, p, q-1);
Quick_Sort(A, q, r);
}
else

break;

}
0黄瓜0 2007-10-14
  • 打赏
  • 举报
回复
就是让初始化的数组有序,然后才会堆栈溢出,无序的时候就算数组为200000个也不会溢出啊。
=========================
因为你用的是递归,消耗栈内存大.你事先就消耗了比较大的栈内存,再调用QuickSort就会溢出了.我VC6中试了,只要你数组大于8635就会溢出了.

在你调用QuickSort前,当然栈没有溢出了.

int a[BOUND];改为
int *a=new int[BOUND];



after_sss 2007-10-14
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;
const int bound=10000;//8635就不行了
int Partition(int *a,int p,int r);
void QuickSort(int *a,int p,int r);

int main()
{
int a[bound];
int j;
for(j=0;j<bound;j++)
{
a[j]=j;
}
QuickSort(a,0,bound-1);
cout << "Finish!\n";
return 0;
}
void QuickSort(int *a,int p,int r)///快速排序
{
if(p<r){
int q=Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
int Partition(int *a,int p,int r)
{
int x=a[r];
int i=p-1;
int temp;
for(int j=p;j<r;j++)
{
if(a[j]<=x)
{
i++;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
i++;
temp=a[i];
a[i]=a[r];
a[r]=temp;

return i;
}

after_sss 2007-10-14
  • 打赏
  • 举报
回复
你没看懂我的问题啊,
我把代码弄更清楚些:
#include<iostream>
using namespace std;
const int bound=10000;//8635就不行了
int Partition(int *a,int p,int r);
void QuickSort(int *a,int p,int r);

int main()
{
int a[bound];
int j;
for(j=0;j<bound;j++)
{
a[j]=j;
}
QuickSort(a,0,bound-1);
cout << "Finish!\n";
return 0;
}
void QuickSort(int *a,int p,int r)///快速排序
{
if(p<r){
int q=Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
int Partition(int *a,int p,int r)
{
int x=a[r];
int i=p-1;
int temp;
for(int j=p;j<r;j++)
{
if(a[j]<=x)
{
i++;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
i++;
temp=a[i];
a[i]=a[r];
a[r]=temp;

return i;
}

就是让初始化的数组有序,然后才会堆栈溢出,无序的时候就算数组为200000个也不会溢出啊。
after_sss 2007-10-14
  • 打赏
  • 举报
回复
还是不可以啊
yshuise 2007-10-14
  • 打赏
  • 举报
回复
int Quick_Sort(int A[], int p ,int r)
{
if(p < r)
{
int q = Partition(A, p, r);
Quick_Sort(A, p, q-1);
Quick_Sort(A, q, r);
}
else

return 0;

}


改成这样也行。上面那个不行。我编译运行了。
yshuise 2007-10-14
  • 打赏
  • 举报
回复
void Quick_Sort(int A[], int p ,int r)
{
if(p < r)
{
int q = Partition(A, p, r);
Quick_Sort(A, p, q-1);
Quick_Sort(A, q, r);
}
else

break;

}
试一下看。
yshuise 2007-10-14
  • 打赏
  • 举报
回复
MinGW Developer Studio
我用的这个。
after_sss 2007-10-14
  • 打赏
  • 举报
回复
不可能吧,我用vc 6.0运行没有结果,直接显示 press any key to continue
再用visual studio .net 2003运行,说:a.exe 中的 0x00402019 处未处理的异常: 0xC00000FD: Stack overflow
yshuise 2007-10-14
  • 打赏
  • 举报
回复

#include <iostream>
#include <time.h>
using namespace std;

int Partition(int A[], int p, int r)
{
int x = A[r];//选择x=A[r]作为主元
int i = p -1;
for(int j = p; j <= r-1; j++)
if(A[j] <= x)//假设A[i]大于x,那么就不用移动了。第二个语句swap()将x移动到最左方,所以比x大的数都在右方。
{ //假设A[j]小于x,因为A[i]的下标i始终小于等于j,那么说明A[i]是大于x的值,否则便是被移动了。
i = i+1;//这样第一个函数swap()将把大于x的A[i]与小于x的A[j]互相交换位置。
std::swap(A[i], A[j]);
}
std::swap(A[i+1], A[r]);

return i+1;

}

void Quick_Sort(int A[], int p ,int r)
{
if(p < r)
{
int q = Partition(A, p, r);
Quick_Sort(A, p, q-1);
Quick_Sort(A, q, r);
}

}


int main(int argc, char* argv[])
{

srand(time(0));
const int max=20000;
int C[max];
for(int j=0;j <max;j++)
C[j]=j;
Quick_Sort(C, 0, max-1);
for(int i = 0; i < max; i++)
std::cout <<C[i] <<" ";
return 0;
}
yshuise 2007-10-14
  • 打赏
  • 举报
回复
078 16079 16080 16081 16082 16083 16084 16085 16086 16087 16088 16089 16090 1609
1 16092 16093 16094 16095 16096 16097 16098 16099 16100 16101 16102 16103 16104
16105 16106 16107 16108 16109 16110 16111 16112 16113 16114 16115 16116 16117 16
118 16119 16120 16121 16122 16123 16124 16125 16126 16127 16128 16129 16130 1613
1 16132 16133 16134 16135 16136 16137 16138 16139 16140 16141 16142 16143 16144
16145 16146 16147 16148 16149 16150 16151 16152 16153 16154 16155 16156 16157 16
158 16159 16160 16161 16162 16163 16164 16165 16166 16167 16168 16169 16170 1617
1 16172 16173 16174 16175 16176 16177 16178 16179 16180 16181 16182 16183 16184
16185 16186 16187 16188 16189 16190 16191 16192 16193 16194 16195 16196 16197 16
198 16199 16200 16201 16202 16203 16204 16205 16206 16207 16208 16209 16210 1621
1 1989
……
……这是我删除的数字
1 19892 19893 19894 19895 19896 19897 19898 19899 19900 19901 19902 19903 19904
19905 19906 19907 19908 19909 19910 19911 19912 19913 19914 19915 19916 19917 19
918 19919 19920 19921 19922 19923 19924 19925 19926 19927 19928 19929 19930 1993
1 19932 19933 19934 19935 19936 19937 19938 19939 19940 19941 19942 19943 19944
19945 19946 19947 19948 19949 19950 19951 19952 19953 19954 19955 19956 19957 19
958 19959 19960 19961 19962 19963 19964 19965 19966 19967 19968 19969 19970 1997
1 19972 19973 19974 19975 19976 19977 19978 19979 19980 19981 19982 19983 19984
19985 19986 19987 19988 19989 19990 19991 19992 19993 19994 19995 19996 19997 19
998 19999

Terminated with return code 0
Press any key to continue ...

等一下就出来了,哈哈 我
after_sss 2007-10-14
  • 打赏
  • 举报
回复

#include<time.h>
int main(int argc, char* argv[])
{
srand(time(0));
const int max=20000;
int C[max];
for(int j=0;j<max;j++)
{
C[j]=rand()%10000;
}
Quick_Sort(C, 0, max-1);
for(int i = 0; i < max; i++)
std::cout<<C[i]<<" ";
return 0;
}


你的代码也有问题啊,
把你的主函数改成这样,是可以出结果的,但是如果把其中的C[j]=rand()%10000改成C[j]=j;就不能出结果。你看看吧
0黄瓜0 2007-10-14
  • 打赏
  • 举报
回复
int a[BOUND]; //你这个局部数组太大时造成栈耗尽.


#include <iostream >
#include <time.h >
using namespace std;

const int BOUND=8635;//8635就不行了
void QuickSort(int *a,int p,int r);

int main()
{
int *a=new int[BOUND];
srand(time(0));
int j;
for(j=0;j <BOUND;j++)
{
a[j]=rand()%9999;
}
QuickSort(a,0,BOUND-1);//////////////////////////////////////
QuickSort(a,0,BOUND-1);
cout << "Finish!";
return 0;
}

void QuickSort(int *a,int p,int r)///快速排序
{
if(p >=r)
return;
int temp,i,j;
int p1=p;
int r1=r;

do
{
for(i=r1;i >p1;i--)
{
if(a[p1] >a[i])
{
temp=a[p1];
a[p1]=a[i];
a[i]=temp;
break;
}
}
for(j=p1+1;j <i;j++)
{
if(a[i] <a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
break;
}
}
r1=i;
p1=j;
}
while(i >j);

QuickSort(a,p,i-1);
QuickSort(a,i+1,r);
}



yshuise 2007-10-14
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <iostream>

int Partition(int A[], int p, int r)
...{
int x = A[r];//选择x=A[r]作为主元
int i = p -1;
for(int j = p; j <= r-1; j++)
if(A[j] <= x)//假设A[i]大于x,那么就不用移动了。第二个语句swap()将x移动到最左方,所以比x大的数都在右方。
...{ //假设A[j]小于x,因为A[i]的下标i始终小于等于j,那么说明A[i]是大于x的值,否则便是被移动了。
i = i+1;//这样第一个函数swap()将把大于x的A[i]与小于x的A[j]互相交换位置。
std::swap(A[i], A[j]);
}
std::swap(A[i+1], A[r]);

return i+1;

}

void Quick_Sort(int A[], int p ,int r)
...{
if(p < r)
...{
int q = Partition(A, p, r);
Quick_Sort(A, p, q-1);
Quick_Sort(A, q, r);
}

}


int main(int argc, char* argv[])
...{

int C[12] = ...{100,4,8,7,6,32,5,4,8,1,2,1};
Quick_Sort(C, 0, 11);
for(int i = 0; i <= 11; i++)
std::cout<<C[i]<<" ";
return 0;
}


这是我以前写得, 你看看你那里不对。算法导论上的算法主要注意边界条件。
after_sss 2007-10-14
  • 打赏
  • 举报
回复
int a[BOUND];改为
int *a=new int[BOUND];

这样还是老问题啊。
after_sss 2007-10-14
  • 打赏
  • 举报
回复
我最后的代码就是完全按照《算法导论》上的写的啊,问题依旧。
after_sss 2007-10-14
  • 打赏
  • 举报
回复
我用归并排序就没有这样的问题啊,同样是递归的。我后来改进的代码只用了一次QuickSort()。上面写了。虽然不是我要的答案,但还是谢谢啦!
yshuise 2007-10-14
  • 打赏
  • 举报
回复
看看算法导论上的快速排序吧,很精彩的。
你们写得很 乱。

65,203

社区成员

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

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