1. 程式人生 > >【 python 學習筆記 -- 數據結構與算法 】快速排序 Quick Sort

【 python 學習筆記 -- 數據結構與算法 】快速排序 Quick Sort

mark 效率 空間 eight png orm 歸並 應該 筆記

【快速排序】:

  利用遞歸算法, 首先選擇一個基準值(pivot value),這裏我們選列表的第一個值作為例。這個基準值的作用是協助列表的分割。

  這個基準值在正序列表中的正確位置,我們稱之為分割點(split point)。這個點用於將列表分成兩個部分,然後再對每個部分做快速排序。

  分割過程如下:

  首先我們選擇列表首個元素作為基準值,這個例子中即為54

  技術分享圖片

  接下來尋找分割點,在這個過程中同時會將小於基準值的元素移動到分割點左邊,將大於基準值的元素移動到分割點右邊。

  為了完成上述操作,我們設置兩個標記符leftmark和rightmark來追蹤掃描各個元素的過程:

    當leftmark位置的元素小於或等於基準值時,leftmark向右移動一個位置繼續掃描;當leftmark位置的元素大於基準值時停止掃描。

    同理,當rightmark位置的元素大於或等於基準值時,rightmark向左移動一個位置繼續掃描;當rightmark位置的元素小於基準值時停止掃描。

    停止掃描後,我們比較leftmark和rightmark的大小,如果rightmark<leftmark,rightmark就是基準值應該存放的位置,也就是分割點,我們將基準值交換到這個位置,返回分割點位置以便下一步遞歸操作;否則交換兩個位置的元素。

  技術分享圖片

  將基準值存放到正確的位置後,我們看到現在的列表中,在基準值左側的元素都小於基準值,在右側的元素都大於基準值。所以我們以基準值為分割點,將列表分成左右兩個子列表,再繼續對子列表做快速排序,直到子列表的長度為0或1。

  技術分享圖片

【 implementation of quick sort 】

  技術分享圖片

【 performance analysis】

  和歸並排序相比,快速排序不需要多余的空間;但缺點是列表有可能不是平均分割的,將導致效率降低。

  最壞的情況就是每次分割都是將列表分成一個長度為0的子列表和一個長度為n-1的子列表, 這種情況下,時間復雜度為O(n2)。

  我們可以通過改變基準值的選取方法來減弱這種不平均分割的現象,一種方法是選取列表第一個元素,中間元素,最後一個元素中數值大小處於中間的那個值作為基準值。

【 python 學習筆記 -- 數據結構與算法 】快速排序 Quick Sort