目前学习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)。如果我这样做,这个程序将继续循环,永远不会结束。
感谢您的关注。任何建议都将受到高度赞赏。
答案 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,