Почему Bubble Sort внешний l oop заканчивается в n-1? - PullRequest
1 голос
/ 10 апреля 2020

Я нашел этот пузырьковый сорт (первый сорт, который я когда-либо изучал), я понимаю его почти полностью, но я застрял на одном месте.

    public static int[] bubbleSort(int[] tempArray) { 
    int i, j, temp, n = tempArray.length; 
    boolean swapped; 
    for (i = 0; i < n - 1; i++) { 
        swapped = false; 
        for (j = 0; j < n - i - 1; j++) { 
            if (tempArray[j] > tempArray[j + 1]) { 
                temp = tempArray[j]; 
                tempArray[j] = tempArray[j + 1]; 
                tempArray[j + 1] = temp; 
                swapped = true; 
            } 
        } 
        if (swapped == false) 
            break; 
    }
    return tempArray; 
} 

в чем смысл "n - 1 "во внешнем l oop, кроме того, чтобы сделать внутреннее l oop (n - i - 1) короче? Я попытался удалить «n -1» и иметь count ++ для работы во внутренней l oop, и результат был таким же, так в чем же тогда причина? Спасибо!

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Это потому, что самый большой элемент уже отсортирован в первой итерации.

Изображение стоит тысячи слов

enter image description here

Изображение взято из https://en.wikipedia.org/wiki/Bubble_sort

Дополнительно, последний элемент не требуется, поскольку сортировка пузырьков связана с заменой соседнего элемента, а последний элемент не имеет соседнего элемента.

0 голосов
/ 10 апреля 2020

Это связано с тем, что пузырьковая сортировка работает при замене соседнего элемента. Если внешний l oop идет до n, то во внутреннем l oop вы не можете выбрать другой элемент.

temp = tempArray[j]; 
tempArray[j] = tempArray[j + 1]; 
tempArray[j + 1] = temp;

Это потому, что размер массива равен n, а внутренний l oop поменялся местами между j и j + 1. Не стесняйтесь задавать дополнительные сомнения.

...