关于quicksort的两个问题

时间:2014-02-06 09:30:10

标签: c++ c quicksort

目前学习quicksort时我有两个问题。标准代码在这里(从我的书中复制):

void Quicksort(int a[], int low, int high){
    if(low<high){
      int pivotpos=Patrition(a,low,high);
      Quicksort(a,low,pivotpos-1);
      Quicksort(a,pivotpos+1,high);
    }
}
int Patrition(int a[], int low, int high){
    int pivot=a[low];  //first elemnent as pivot
    while(low<high){
        while(low<high&&a[high]>=pivot) --high;   //1
        a[low]=a[high];
        while(low<high&&a[low]<=pivot)  ++low;    //2
        a[high]=a[low];
   }
    a[low]=pivot;
    return low;     
}

我的问题在上面的代码中(标记为1和2):

一个。当我在1中输入时,为什么程序无法执行(核心转储):    while(a[high]>=pivot) --high(同样在2中)。似乎我必须在第二个和第三个while循环中添加condition(low<high),或者它说核心被转储?

湾另一个问题是为什么在第二个和第三个while循环中必须有operator=。我很困惑,为什么当我输入while(low<high&& a[high]>pivot时它不会工作(类似于2)。如果我这样做,这个程序将继续循环,永远不会结束。

感谢您的关注。任何建议都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

必须写低&lt;&lt;每个while循环中的高位是因为它首先检查第一个条件(大一个),开始循环,然后检查条件在// 1中并保持循环,但在此期间,第一个while(大的)条件永远不会被检查。

示例:

a = 6;

while (a > 5) {
    while (a > 3) {
         --a;
    }
}

在此代码中,第二个循环仅在a = 3时停止。

至于问题b,这是因为它实际上从未达到需要更改的值,因此从未实际对其进行排序。

示例:如果您希望循环停止在a = 3,则以下循环将提前一步停止。

a = 5;
while (a > 4) {
     --a;
}

值a永不达到3,它停在a = 4,