Два вопроса о быстрой сортировке

0

У меня есть два вопроса при изучении 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). Если я это сделаю, эта программа будет продолжать цикл и никогда не закончится.

Спасибо за внимание. Любое предложение будет высоко оценено.

  • 0
    Ну, если вы этого не сделаете, вы можете оказаться в ситуации, когда high < low ...
  • 0
    Честно говоря, лучший способ решить эту проблему - пройти через ручку и бумагу. Выберите простой массив из 4 или 5 элементов, запишите его, а затем запишите, что происходит и как оно меняется каждый раз, когда вы проходите цикл.
Показать ещё 2 комментария
Теги:
quicksort

1 ответ

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,

  • 0
    большое спасибо. Я понял! когда оно переходит в малое время, условие большого времени проверяться не будет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню