資料結構之快速排序

2021-10-09 18:26:39 字數 1593 閱讀 8481

快速排序從程式上看起來和歸併排序特別像,都採取了遞迴分治的思想,將資料逐步分解。快排首先在序列中選定某乙個樞軸(pivot),然後將除樞軸位置的資料與樞軸資料比較,大於的放在右邊,小於的放在左邊,然後分兩邊再次遞迴,直到遞迴資料個數趨為1,這樣資料就排好序了。

void

quicksort

(int arr,

int num)

;void

quicksort

(int arr,

int head,

int tail)

;int

partition

(int arr,

int head,

int tail)

;void

swap

(int arr,

int a,

int b)

void

quicksort

(int arr,

int num)

void

quicksort

(int arr,

int head,

int tail)

intpartition

(int arr,

int head,

int tail)

}swap

(arr, j, tail)

;return j;

}

穩定性:快排不是穩定的排序演算法,快排的插入與交換取決於樞軸點的選取,比如說8,6,8,1,5,3這個陣列,在第一輪的分割槽中第乙個8就會排到第二個8後面,所以快排不是穩定的排序演算法2.空間複雜度:單單通過演算法就能看出並沒有像歸併那樣額外申請記憶體,僅僅只需要在同個陣列內完成,因此為o(1),屬於原地排序演算法

3.時間複雜度:因為採用了與歸併類似的思想,假設陣列每次都能完美拆分為兩個對半的,這樣的時間複雜度即為o(nlogn),但是樞軸值的選取倘若很極端,極端到每次的選擇要麼為最大值,要麼為最小值,就相當於氣泡排序那樣,就會退化成為o(n²)

在上面的時間複雜度分析中,可以看出快排的時間複雜度並不穩定,造成這個結果的原因就是主要因為樞軸值的選擇,因此對樞軸值選擇的優化頗為重要,比如說三數取中,九數取中,盡量擴大取樣資料的範圍,這樣才能優化樞軸值的選擇

當我們在遞迴到某個深度的時候,資料規模較小,此時插入排序的效能可能比快排的效能還要好,則可以設定乙個閾值,切換排序演算法的實現,這樣也能提高效率

歸併直接首先直接二分分割槽,落井下石到最底層才開始執行合併排序的操作,歸併由下到上

快排首先會確定位置再分割槽,然後遞迴,隨著中間位置點的越分越多,資料的序列性表現的越明顯,快排由上到下

歸併的空間複雜度比快排高,尤其在大量資料面前,歸併的記憶體占用相當可怕

快排的時間複雜度並不如歸併的穩定

快排是不穩定的排序演算法,有可能會改變相同元素的先後順序

資料結構排序之快速排序

本來昨天晚上就可以把快速排序發上去,沒想到昨晚csdn竟然維護,那麼就只能在停電的情況下下用學校的卡的要死的網發這快速排序了,不停多好,停電了還得自己掏腰包買個充電檯燈,裝的好像像學霸一樣,實際就是乙個大學渣,我也就不jjyy,直接說快速排序的思想,我是這樣理解的,用乙個變數作為基準,在拿出i和j兩...

資料結構之快速排序

3.編寫乙個快速排序的演算法,並且在main函式中驗證其功能已實現 快速排序 quick sort 又稱劃分交換排序,基本思想 在待排序的n 個記錄中記錄中任取乙個作為 基準 將其餘記錄分為兩組,第一組中 各記錄的鍵值均小於或等於基準的鍵值,第二組中各記錄的鍵值均大於 或等於基準的鍵值,而基準就排在...

資料結構之快速排序

旁白 演算法小白白一枚,突然要掌握演算法。花廢了2個小時把一些基本的知識掌握。包括偽 書寫規則 演算法設計技術和時間複雜性的計算弄清楚。本打算用本子做筆記,一想發現沒筆 沒本子,這對本在疫情被困在家的我來說是一筆 鉅額 所以想到寫部落格,一方面剛接觸感覺有點意思,另一方面當做筆記隨時可以複習看看 廢...