У меня есть два вопроса при изучении 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):
а. почему программа не может быть выполнена (ядро сбрасывается), когда я while(a[high]>=pivot) --high
ее в 1: while(a[high]>=pivot) --high
(аналогично в 2). Кажется, что я должен добавить condition(low<high)
во втором и третьем циклах, или он сказал, что ядро сбрасывается?
б. другой вопрос - почему во втором и третьем циклах должен быть operator=
. Я смущен, почему это не сработает, когда я набираю while(low<high&& a[high]>pivot
(аналогично в 2). Если я это сделаю, эта программа будет продолжать цикл и никогда не закончится.
Спасибо за внимание. Любое предложение будет высоко оценено.
Причиной того, чтобы писать низкий <высокий в каждом цикле 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,
high < low
...