資料結構 快速排序

2022-07-29 12:21:13 字數 1592 閱讀 9331

快速排序是對氣泡排序的一種改進。其基本思想是基於分治法的;在待排序表l[1….n]中任取乙個元素pivot作為基準,通過一趟排序將待排序表劃分為獨立的兩部分l[1…k-1]和l[k+1…n],使得l[1….k1]中所有元素小於pivot,l[k+1….n]中所有元素大於或等於pivot,則pivot放在了其最終位置l(k)上,這個過程稱作一趟快速排序。而後分別遞迴地對兩個子表重複上述過程,直至每部分內只有乙個元素或空為止,即所有元素放在了其最終位置上。

首先假設劃分演算法已知,記為partition(),返回的是上述中的k,注意到l(k)已經在最終的位置,所以可以先對表進行劃分,而後對兩個表呼叫同樣的排序操作。因此可以遞迴地呼叫快速排序演算法進行排序,具體的程式結構如下介紹。

void quicksort(elemtpye a,int low,int high)

}

從上面的**也不難看出快速排序演算法的關鍵在於劃分操作,同時快速排序演算法的效能也主要取決於劃分操作的好壞。假設每次總是以當前表中第乙個元素作為樞軸值(基準)對錶進行劃分,則必須將表中比樞軸值大的元素向右移動,比樞軸值小的元素向左移動,使得每一趟partition()操作後,表中的元素被樞軸值一分為二。

int partition(elemtype a,int low,int high)

return low;//最後a[low]的左側keys都比它小,右側keys都比它大

}

空間複雜度:由於快速排序是遞迴的,需要借助乙個遞迴工作棧來儲存每一層遞迴呼叫的必要資訊,其容量應該與遞迴呼叫的最大深度一致。最好情況下為log₂(n+1);最壞情況下,因為要進行n-1次呼叫,所以棧的深度為o(n);平均情況下,棧的深度為o(log₂n)。因而空間複雜度在最壞的情況下為o(n),平均情況下為o(log₂n)。

時間複雜度:快速排序的執行時間與劃分是否堆成有關,而後者又與具體使用的劃分演算法有關,快速排序的最壞情況下發生在兩個區域分別包含n-1個元素和0哥元素時,這種最大程度的不對稱性若發生在每一層遞迴上,即對應於初始排序表基本有序或者基本逆序時,就得到最壞情況下的時間複雜度為o(n²)(改進後為o(nlog₂n))。

穩定性:在劃分演算法中,若右端區間存在兩個關鍵字相同,且均小玉基準值的記錄,則在交換到左端區間後,它們的相對位置會發生變化,即快速排序是乙個不穩定的排序方法。例如表l=,經過一趟排序後,l={2,2,3},最終序列也是{2,2,3},相對次序已經發生了改變。

有很多種方法可以提高演算法的效率,一種方法是遞迴過程中劃分得到的子串行的規模較小時不要再繼續遞迴呼叫快速排序,可以直接採用直接插入排序演算法進行後續的排序工作。另一種方法就是盡量選擇乙個可以將資料中分的樞軸值元素。如從序列的頭尾以及中間選擇三個元素,再取這三個元素的中間值作為最終的樞軸元素;或者隨機從當前表中選取樞軸元素,這樣做使得最壞的情況在實際排序中幾乎不會發生。

在最理想的情況下,也就是partition()可能做到最平衡的劃分中,得到的兩個子問題的大校都不可能大於n/2,在這種情況下,快速排序的執行速度將大大提公升,此時,時間複雜度為o(nlog₂n)。好在快速排序平均情況下執行時間與其最佳情況下的執行時間很接近,而不是接近其最壞情況下的執行時間。快速排序是所有內部排序演算法中平均效能最優的排序演算法。

資料結構 排序 快速排序

對序列 47,31,83,91,57,18,96,16 進行快速排序 首元素為基準 第二趟排序結果是 正確答案 b 你的答案 c 錯誤 18 31 16 47 57 91 96 83 16 31 18 47 57 91 96 83 16 18 31 47 57 91 96 83 16 18 31 4...

資料結構 排序 快速排序

快速排序在平均情況下是效果最好的排序演算法 每趟子表的排序都是從兩頭向中間交替逼近,接下來舉乙個例子 sorry,上面這個圖的6和5的位置畫反啦,快速排序全域性有序,一趟排序便可以確定基準值的最終位置 類別排序方法 最好時間 最壞時間 平均時間 空間複雜度 穩定性序列特徵 適用於插入排序 直接插入排...

資料結構排序 快速排序

快速排序是對氣泡排序的改進,它的基本思想是通過一趟排序將資料分成兩部分,一部分中的資料都比另一部分中的資料小,再對這兩部分中的資料再排序,直到整個序列有序,如下圖所示。快排的遞迴實現 1 include 2 include 3 4intn 5 6 7 分割使樞軸記錄的左邊元素比右邊元素小8 9int...