快速排序的堆栈深度

时间:2010-11-15 16:57:56

标签: c++ quicksort

我在使用tail recursive版本的quicksort这里是我的代码

  #include <iostream>
using namespace std;

int partition(int a[],int l,int r){
    int pivot=a[l];
     std::swap(a[pivot],a[r]);
      int store=l;
       for (int i=l;i<r;i++){
           if (a[i]<=pivot){
               std::swap(a[i],a[store]);
           store=store+1;
           std::swap(a[store],a[r]);
           }

       }
        return store;
}
void tail_quick(int a[],int p,int r){

    while(p<r){

    int  q=partition(a,p,r);
     tail_quick(a,p,q-1);
     p=q+1;
    }
}
int main(){
    int a[]={21,10,13,8,56,9,34,11,22,44};
    int n=sizeof(a)/sizeof(int);
    tail_quick(a,0,n-1);
     for (int i=0;i<n;i++)
         cout<<a[i]<<"  ";



     return 0;
}

但是输出不正确没有排序,并且还有一些randome数字输出请帮助

2 个答案:

答案 0 :(得分:0)

您在以下partition的通话中使用了未初始化的变量。你确定这不应该是别的吗?

void tail_quick(int a[],int p,int r){

    while(p<r){

    int  q=partition(a,p,q); // <--- uninitialized variable "q"
     tail_quick(a,p,q-1); 
     p=q+1;
    }
}

答案 1 :(得分:0)

你有几个问题。

首先,在partition()中,您已将pivot INDEX与pivot VALUE混淆。 VALUE应该用于比较,并且初始的pivot INDEX应该用于交换。由于您使用第一个元素作为枢轴(不是性能最佳),因此您应该将第一个交换更改为使用“l”而不是“pivot”。请注意,您使用数组的第一个值作为索引。

接下来,“最终”交换应该在for循环之外完成,而不是在每次迭代时完成。因此,您的partition()函数应如下所示:

int partition(int a[],int l,int r){
    int pivot=a[l];
    std::swap(a[l],a[r]);
    int store=l;
    for (int i=l;i<r;i++){
      if (a[i]<=pivot){
        std::swap(a[i],a[store]);
        store=store+1;
      }
    }
    std::swap(a[store],a[r]);
    return store;
}

你的tail_quick()函数可以正常工作,但只需进行两次递归调用就更好了......

void tail_quick(int a[],int p,int r){
    if (p < r){
      int  q=partition(a,p,r);
      tail_quick(a,p,q-1);
      tail_quick(a,q+1,r);
    }
}

但是,您应该使用标准库,因为它会为您提供正确的答案并提供最佳性能。