Массив: 4,1,5,8,2,6,9,7,11,3

public static void quickSort(int arr[], int low, int high) {
    System.out.println(low + " " + high);
    while(low < high) {
        int mid = quickPart(arr, low, high);            
        quickSort(arr, low, mid - 1);          
        quickSort(arr, mid + 1, high);
    }
}

Он печатает: 0 0, затем 2 1, затем снова 0 0 и 2 1 и т. д. для S.o.pl (низкий + "" + высокий)

но для ..

public static void quickSort(int arr[], int low, int high) {
    System.out.println(low + " " + high);
    if(low < high) {
        int mid = quickPart(arr, low, high);            
        quickSort(arr, low, mid - 1);          
        quickSort(arr, mid + 1, high);
    }
}

Он печатает: 0 9, 0 1, 0 0, 2 1, 3 9, 3 3, 5 9 ... он работает нормально.

разделение кода, если это поможет ..

public static int quickPart(int arr[], int low, int high) {
    int pivot = arr[high];
    int i = low - 1;
    for(int j = low; j < high; j++) {
        if(pivot > arr[j]) {
            i++;
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    int temp = arr[i+1];
    arr[i+1] = arr[high];
    arr[high] = temp;
    System.out.println(i++);
    return i+1;
}

Для оператора if код завершится, как только low> = high , и для этого он достигнет значения 9, то есть 9> 9 завершится Но для алгоритма while + partitioning он выводит 1 в повторении. Почему он так себя ведет?

1
Anuj Mehta 24 Фев 2020 в 09:47

3 ответа

Ваш метод не изменяет значения low и high, поэтому условие цикла - (low < high) либо никогда не будет истинным (и цикл завершится немедленно), либо всегда будет истинным (и цикл будет бесконечным).

Это рекурсивный алгоритм, поэтому вам не нужен цикл. Вам просто нужен оператор if, который определяет, должна ли рекурсия продолжаться или заканчиваться.

1
Eran 24 Фев 2020 в 06:51

Из заявлений «время и время выполнения»

Оператор while вычисляет выражение, которое должно возвращать логическое значение. If the expression evaluates to true, the while statement executes the statement(s) in the while block. The while statement continues testing the expression and executing its block until the expression evaluates to false.

Так что в вашем while(low < high) это всегда true, поэтому бесконечный цикл.

Где в виде оператора if-then

Оператор if-then является самым базовым из всех операторов потока управления. Он говорит вашей программе выполнить определенный раздел кода, только если конкретный тест оценивается как true.

Что еще более важно, в отличие от циклов, он выполняется только один раз, если условие является условием, поэтому он отлично работает в вашем случае.

Для быстрой сортировки посмотрите QuickSort.

0
Sumit Singh 24 Фев 2020 в 07:01

Как уже было сказано, while будет зацикливаться вечно, так как ни low, ни high не обновляются, поэтому вместо этого требуется if, поскольку он выполняется только один раз или вообще не выполняется.

В то время как обычно используется вместе с a, если это повторяется только на меньшем разделе, затем обновляется низкий или высокий и возвращается к началу для большего раздела. Это ограничивает сложность стекового пространства O (log (n)), но сложность по времени в худшем случае все еще составляет O (n ^ 2).

public static void quickSort(int arr[], int low, int high) {
    System.out.println(low + " " + high);
    while(low < high) {
        int mid = quickPart(arr, low, high);
        if((mid-low) <= (high-mid)){
            quickSort(arr, low, mid - 1);
            low = mid+1;
        } else {
            quickSort(arr, mid + 1, high);
            high = mid-1;
        }
    }
}
0
rcgldr 24 Фев 2020 в 22:28