我有这个快速排序代码,我想排除故障。我在分区中更改了此代码。尝试选择pivot元素作为数组的中位数。但它仍然没有给我正确的输出。在这里,我有不同的四种类型的数组,我已经动态创建并尝试对它们进行排序。快速排序应用了四次。
int counter=0, comparison=0;
void QUICKSORT(int *,int,int);
int PARTITION(int * ,int,int);
int values(float l);
int main(){
int i,n,q;
cout<<"Enter number of elements:";
cin>>n;
int* a = new int[ n ];
for(int p=1;p<=n;p++)
{
q = rand() % (n*100) ;
a[p]=q;
}
cout<<"\nThe elements od the original array are:\n\n";
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
clock_t tStart = clock();
QUICKSORT(a,1,n);
cout<<"\nThe elements of the sorted array are:\n\n";
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
}
// function for the generation of random poisson values. This function is called as many times
// as the array size decided by the user
int values(float l)
{
for (int i=0;i<1000;i++)
{
float L=exp(-l);
float k=0;
float p=1;
//begin while
do{
k=k+1;
double u = rand() / (double)RAND_MAX;
p=p*u;
} while (p>L);
return k-1;
}
}
//}
void QUICKSORT(int *a,int p,int r){
int q;
if(p<r){
q=PARTITION(a,p,r);
QUICKSORT(a,p,q-1);
QUICKSORT(a,q+1,r);
}
}
int PARTITION(int *a,int p,int r){
counter++;
// cout<<" first a " <<a[p]<<endl;
// cout<<" second a : "<<a[r-1]<<endl;
int x=(a[r]+a[p])/2;
//int x=a[r];
int i = p-1,temp,j;
for(j=p;j<=r-1;j++){
if(a[j]<=x){
i=i+1;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
temp=a[i+1];
a[i+1]=a[r];
a[r]=temp;
return(i+1);
}
答案 0 :(得分:0)
一目了然..
QUICKSORT(a,p,q-1);
QUICKSORT(a,q+1,r);
看起来应该是:
QUICKSORT(a,p,q);
QUICKSORT(a,q+1,r);
或:
QUICKSORT(a,p,q-1);
QUICKSORT(a,q,r);
但是这种分区方法看起来很有问题。即使它成功找到中位数,我怀疑它值得努力。快速排序的重点是尽可能少地进行比较,因此循环遍历每个整个子阵列以找到那种目的的失败的中间类型,并且是过度的。我建议选择三个项目:第一个,中间,最后一个,并且只使用这些项目的中位数。