簡體   English   中英

為什么插入排序比排序數組的快速排序快

[英]Why is insertion sort faster than quick sort on a sorted array

我正在比較插入排序和快速排序。 我已經弄清楚為什么 qsort 在幾乎已排序的數組上較慢,但我無法弄清楚為什么插入排序要快得多,當然它仍然必須比較數組中幾乎相同數量的元素?

插入排序在排序或接近排序的數組上更快的原因是,當將元素插入數組的排序部分時,它幾乎不需要移動任何元素。 例如,如果數組的排序部分是1 2並且下一個元素是3 ,它只需要進行一次比較 - 2 < 3 - 以確定它根本不需要移動3 因此,對已排序數組的插入排序是線性時間的,因為它只需要對每個元素進行一次比較。

這取決於幾個因素。 插入排序比對小數據集的快速排序更有效。 它還取決於您的支持列表實現(LinkedList 或 ArrayList)。 最后,它還取決於輸入數據是否有任何排序。 例如,如果您的輸入數據已經按相反順序排序並且您使用 LinkedList,則插入排序將非常快。

快速排序在已經排序的數組上有其最壞的情況(O(n^2) 時間復雜度)(請參閱Wikipedia 上的快速排序條目)。

根據樞軸元素的選擇,這可以有所緩解,但同時,插入排序的最佳情況正是預排序的情況(對於此類輸入,它的時間復雜度為 O(n)),因此將在這個特定用例中擊敗快速排序。

插入排序算法在已排序數組上以線性時間運行,因為對於已排序數組,插入排序只需進行一次比較,即對前一個元素進行比較,因此已排序數組上的插入排序必須線性移動,得到復雜度為 - O(n)。 與復雜度為 O(n2) 的快速排序相比

排序輸入是插入排序 (O(n)) 的最佳情況和快速排序 (O(n^2)) 的最壞情況。

這一切都與復雜性有關,復雜性由密鑰比較的數量決定,這是兩種算法中的基本操作。

因此,當您看到兩者的算法時,您會發現在插入排序中您只有 n 比較,因為當我們插入一個元素時,我們只與左元素進行比較並完成。 另一方面,在快速排序的情況下,您必須繼續將樞軸元素與所有左元素進行比較,並且您的數組會減少一個常數,導致大約 n^2 的比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM