C++ 对不正确的结果进行快速排序

C++ 对不正确的结果进行快速排序,c++,sorting,quicksort,C++,Sorting,Quicksort,我有这个快速排序代码,我想排除故障。分区中有我更改的代码。已尝试选择轴元素作为数组的中间值。但它仍然没有给我正确的输出。在这里,我动态创建了四种不同类型的数组,并尝试对它们进行排序。有四次应用快速排序 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

我有这个快速排序代码,我想排除故障。分区中有我更改的代码。已尝试选择轴元素作为数组的中间值。但它仍然没有给我正确的输出。在这里,我动态创建了四种不同类型的数组,并尝试对它们进行排序。有四次应用快速排序

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);
}
int计数器=0,比较=0;
无效快速排序(int*,int,int);
int分区(int*,int,int);
int值(浮点l);
int main(){
inti,n,q;
coutn;
int*a=新的int[n];
对于(int p=1;p一目了然.)

QUICKSORT(a,p,q-1);
QUICKSORT(a,q+1,r);
看起来应该是:

QUICKSORT(a,p,q);
QUICKSORT(a,q+1,r);
或:


但是,这种划分方法看起来也很可疑。即使它成功地找到了中间值,我怀疑它是否值得付出努力。快速排序的目的是尽可能少地进行比较排序,因此在整个子数组中循环查找中间值的方法无法达到这一目的,而且是过分的。我建议选择三项:f第一个、中间个、最后一个,只使用中间值。

您可以这样写:“我有一个快速排序代码,我想对其进行故障排除。”--是什么阻止您进行故障排除?到目前为止您做了什么?具体问题是什么?故障排除的建议:尽可能减少代码以找出错误发生的位置。如果您在此处发布5行代码询问问题,您更可能得到答复。如果您发布大量代码,则只有people渴望得到代表(或太善良的人)将回答。另外,不要动态创建数据。使用总是导致问题的已知数据集,并一直使用这些数据直到问题得到解决。在解决问题时更改数据是程序员的噩梦。大卫:我已经减少了代码。爱德华:如果我有这个int x=(a[r]+a[p])/2、 ,那么它没有给我正确的输出,但是如果我有这个int x=a[r],它工作得很好。我想更改所选的枢轴元素,而是将中值作为枢轴元素。谢谢!它工作得很好。但是当我使用x=a[r]时。它也给了我正确的输出。这怎么可能?可能是因为您选择枢轴的方法只在最坏的情况下才起作用,即在几乎排序的数据上。这就是为什么不值得找到精确的中值。澄清一下:您选择枢轴不会改变排序的输出,它只会影响算法的速度。
QUICKSORT(a,p,q-1);
QUICKSORT(a,q,r);