快速排序是最快的排序演算法之一。它採用一組值,選擇其中一個值作為「樞軸」元素,並移動其他值,以便較低的值位於樞軸元素的左側,較高的值位於其右側。
快速排序是演算法世界中最優雅、最有效率的排序演算法之一。與冒泡排序或選擇排序等更簡單的演算法不同,快速排序採用複雜的分而治之策略,使其在實踐中速度顯著加快。雖然合併排序也使用分而治之,但快速排序獨特的分區方法通常會帶來更好的效能和記憶體使用。
平均時間複雜度:O(n log n)
最壞情況時間複雜度:O(n²)
空間複雜度:O(log n)
快速排序是一種高效的排序演算法,它的工作原理是從數組中選擇一個「主元」元素,然後根據其他元素是否小於或大於主元將它們劃分為兩個子數組。與先劃分後合併的歸併排序不同,快速排序在劃分過程中進行排序。
考慮與其他排序演算法的比較:
Algorithm | Time Complexity (Average) | Space Complexity | In-Place? |
---|---|---|---|
Quick Sort | O(n log n) | O(log n) | Yes |
Merge Sort | O(n log n) | O(n) | No |
Bubble Sort | O(n²) | O(1) | Yes |
Selection Sort | O(n²) | O(1) | Yes |
Heap Sort | O(n log n) | O(1) | Yes |
在深入研究快速排序演算法的 JavaScript 實作之前,讓我們透過四個簡單步驟手動對簡單的數字數組進行排序,逐步了解該演算法的工作原理。
快速排序可以分為四個簡單的步驟:
- 從陣列中選擇一個主元。這個元素可以是列表/陣列中的第一個、最後一個、中間的甚至是隨機元素。
- 重新排列數組,使所有小於基準的元素位於左側,所有大於基準的元素位於右側。
- 將樞軸元素與數值較大的第一個元素交換,使樞軸位於中間。
- 遞歸地將相同的操作應用於樞軸左側和右側的子數組。
讓我們將這些步驟應用到真實的陣列中。我們可以嗎?
初始陣列: [3, 6, 2, 7, 1]
對所有子數組進行排序後,我們得到最終的排序數組:
排序數組: [1, 2, 3, 6, 7]
以下是現實生活中如何運作的最佳說明:
快速排序的時間複雜度因主元選擇而異:
最佳情況(O(n log n)):
平均情況 (O(n log n)):
最壞情況 (O(n²)):
快速排序的空間複雜度為 O(log n),因為:
function quickSort(arr) { // Base case: arrays with length 0 or 1 are already sorted if (arr.length <= 1) return arr; // Helper function to swap elements const swap = (i, j) => { [arr[i], arr[j]] = [arr[j], arr[i]]; }; // Partition function using Lomuto's partition scheme function partition(low, high) { const pivot = arr[high]; let i = low - 1; for (let j = low; j < high; j++) { if (arr[j] <= pivot) { i++; swap(i, j); } } swap(i + 1, high); return i + 1; } // Main quickSort function implementation function quickSortHelper(low, high) { if (low < high) { const pivotIndex = partition(low, high); quickSortHelper(low, pivotIndex - 1); // Sort left side quickSortHelper(pivotIndex + 1, high); // Sort right side } } quickSortHelper(0, arr.length - 1); return arr; }
快速排序因其效率和就地排序而成為流行的選擇。它具有 O(n log n) 平均情況性能和低空間複雜度,優於冒泡排序和選擇排序等更簡單的演算法。
重點:
確保您不會錯過本系列的任何部分,並與我聯繫以進行更深入的了解
關於軟體開發(Web、伺服器、行動或抓取/自動化)、資料的討論
結構和演算法,以及其他令人興奮的技術主題,請關注我:
敬請期待並祝您編碼愉快????
以上是破解快速排序演算法:幾分鐘內從理論到實踐的詳細內容。更多資訊請關注PHP中文網其他相關文章!