在電腦科學領域,QuickSort 是最有效率、使用最廣泛的排序演算法之一。其對大數據集排序的驚人速度歸功於其「分而治之」的策略。讓我們來看看快速排序是如何運作的!
QuickSort 是一種採用「分而治之」技術的排序演算法。它選擇一個稱為主元的元素,並將清單分割為兩個子陣列:一個包含小於主元的元素,另一個包含大於主元的元素。這個過程在這些子數組上遞歸重複,直到列表完全排序。
樞軸的選擇可能會有所不同。一個簡單的方法是選擇清單中的第一個元素。 然而,根據具體情況,其他策略可能更有效。
當清單有 0 或 1 個元素時,它已經排序,演算法結束。
<code class="language-java">// Verifica se a lista tem 0 ou 1 elemento (já ordenada) if (integerList.isEmpty() || integerList.size() == 1) { return integerList; }</code>
下一步涉及選擇一個主元並將清單分成兩個子陣列:一個具有較小的元素,另一個具有比主元更大的元素。 請參閱如何完成此操作的範例:
<code class="language-java">int pivo = integerList.get(0); // Escolhendo o primeiro elemento como pivô List<Integer> menores = new ArrayList<>(); List<Integer> maiores = new ArrayList<>(); for (int i = 1; i < integerList.size(); i++) { if (integerList.get(i) < pivo) { menores.add(integerList.get(i)); } else { maiores.add(integerList.get(i)); } }</code>
注意: 請注意,比較從 i=1 開始,防止主元包含在次要子數組中。
遞歸開始發揮作用了!該演算法將自己稱為最小和最大子數組,重複該過程直到完成排序。結果的組合如下圖所示:
<code class="language-java">List<Integer> sorted = new ArrayList<>(quickSort(menores)); sorted.add(pivo); sorted.addAll(quickSort(maiores)); return sorted;</code>
快速排序的漸近時間複雜度為 O(n log n),表現出很高的效率,特別是與具有 O(n²) 複雜度的冒泡排序等演算法相比。
註:此解釋改編自 Aditya Bhargava 所寫的《理解演算法》一書的第 4 章。 應該注意的是,這裡可能沒有解決一些細微差別,建議您查閱其他來源以進行更深入的研究。
QuickSort 是一種強大的演算法,它使用遞歸來有效地對清單進行排序。與其他排序演算法相比,它的主要屬性是執行速度,特別是在長列表上。為了更全面的理解,建議閱讀《理解演算法》一書。
您在任何專案中使用過 QuickSort 嗎?在評論中分享您的經驗!
以上是了解快速排序演算法:分而治之的詳細內容。更多資訊請關注PHP中文網其他相關文章!