Quicksort结果不正确

时间:2014-05-16 02:51:10

标签: c++ sorting quicksort

我有这个快速排序代码,我想排除故障。我在分区中更改了此代码。尝试选择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);
}

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);

但是这种分区方法看起来很有问题。即使它成功找到中位数,我怀疑它值得努力。快速排序的重点是尽可能少地进行比较,因此循环遍历每个整个子阵列以找到那种目的的失败的中间类型,并且是过度的。我建议选择三个项目:第一个,中间,最后一个,并且只使用这些项目的中位数。