快速排序 的奇怪问题
就是用自己写的快速排序对数组排序,当只有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);
}
[解决办法]
int a[BOUND]; //你这个局部数组太大时造成栈耗尽.
- C/C++ code
#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); }
[解决办法]
看看算法导论上的快速排序吧,很精彩的。
你们写得很 乱。