Обычная пузырьковая сортировка имеет временную сложность O(n²).
Но, конечно, мы можем написать пузырьковую сортировку значительно оптимизированным способом, который можно действительно использовать с большими данными.
Также можно задать вопрос. в нескольких интервью.
Общий алгоритм пузырьковой сортировки
const commonBubblesort = (arr) => { let swaps; do { swaps = false; for(let i=0;i<arr.length;i++){ if(arr[i]>arr[i+1]){ let temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; swaps = true; } } }while(swaps) return arr; }
Оптимизированный алгоритм пузырьковой сортировки
const optimizedBubblesort = (a) => { let lastSwap = a.length - 1; for (let i = 1; i< a.length; i++) { let is_sorted = true; let currentSwap = -1; for (let j = 0; j < lastSwap; j++) { if (a[j] > a[j+1]) { let temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; is_sorted = false; currentSwap = j; } } if (is_sorted) break; lastSwap = currentSwap; } return a; }
Использование функции Do while
const commonBubblesort = (arr) => { let swaps; let lastSwap = arr.length - 1; do { swaps = false; let currentSwap = -1; for(let i=0;i<lastSwap;i++){ if(arr[i]>arr[i+1]){ let temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; swaps = true; currentSwap = i; } } lastSwap = currentSwap; }while(swaps) return arr; }
Это позволяет пропускать многие элементы, что в худшем случае приводит к увеличению количества сравнений примерно на 50% (хотя и без улучшения количества подкачек), и добавляет очень мало сложности. Поскольку мы вспоминаем, где был наш последний обмен, и знаем, что остальные больше, чем этот.