排序演算法(五) 快速排序

2021-10-03 15:40:37 字數 1660 閱讀 9587

快速排序是一種效率很高的排序演算法,也是我們使用最多的一種排序演算法。

快速排序原理:

兩個指標分別指向陣列兩頭元素,將陣列第乙個元素儲存下來,作為基準數,兩個指標開始向中間移動,先移動陣列尾部指標,直到發現所指元素比基準數小時,將這時候所指向的數賦值給陣列頭部指標指向的位置,然後尾部指標停止移動,頭部指標開始移動,直到移動到所指向的元素比基準元素大時,將此時所指向的元素賦值給尾部指標所指向的位置,頭部指標停止移動,尾部指標再次開始移動,如此往復,當兩個指標位置重合時,停止移動,將基準元素的值賦值給此時所指向的位置,第一次移動結束。此時將陣列分為以基準元素左和右兩個陣列,分別遞迴進行上面的操作,直到得出最後的有序數列。

例:

有一組數列 3,12,2,14,66 請使用快速排序將他們進行從小到大排序。

解:

3 12 2 14 66

第一趟中我們先把val基準數設定為3

l指向3,h指向66,先移動h,我們發現移動到2時,2比3小,所以把2賦值給l指向的位置,此時陣列變成:

2 12 2 14 66

此時h指向第二個2,l指向第乙個2,移動l,到12發現其比基準數3要大,故將12賦值給h的位置,此時陣列變為:

2 12 12 14 66

此時l指向第乙個12,h指向第二個12,移動h,發現跟l重合了,所以此時將基準數賦值給此時的位置,陣列變為:

2 3 12 14 66

第一趟結束,我們可以看出此時基準數3左邊都比3要小,右邊都比3要大,排序成功,將3左右拆成兩個新陣列:2 和 12 14 66,然後分別重複以上步驟,最後便可得到最終結果。

**實現(以下**已經過測試,可以直接執行):

#include

void

quicksort

(int

* arr,

int low,

int high)

;int

findpos

(int

* arr,

int low,

int high)

;int

main()

;quicksort

(arr,0,

6);for

(int i =

0;i <

7;i++)}

//low為陣列開始元素下標,high為結束元素下標

void

quicksort

(int

* arr,

int low,

int high)

}//用於找到基準點的排序後所在的位置

intfindpos

(int

* arr,

int low,

int high)

arr[low]

= arr[high]

;while

(low<=val)

arr[high]

= arr[low];}

arr[low]

= val;

return low;

}

時間複雜度:o(nlogn) 推導過程涉及到遞迴的時間複雜度求解,以後將更新給出。

排序演算法(五) 快速排序

在陣列中選取乙個數作為基準值,進行乙個partition過程,將小於該數的放在左邊,大於的放在右邊,等於的放在中間,再對左右分別進行該操作。時間複雜度 每次partition可以將乙個數字位置確定,將陣列劃分為兩部分,因此想要有序,理想情況每次剛好兩邊大小一樣,則一共需要logn次partition...

排序演算法五 快速排序

取陣列最中間的那個數為基數 取哪乙個數為基數都可以,取中間的只是為了好理解 在左邊找乙個比基數大的數,在右邊找乙個比基數小的數,如果找到就交換兩個數的位置,交換過後再向下尋找,直到左邊的角標大於等於右邊則退出,一輪排序後,基數的左邊一定都是比基數小的,基數的右邊一定是比基數大的,注意 基數不一定還在...

排序演算法總結(五)快速排序

快速排序的思想是選取待排陣列中的乙個數作為中間數 一般是第乙個數 然後將陣列中數與這個中間數進行比較,使中間數左邊的數都小於中間數,中間數右邊的數都大於中間數,這樣中間數就在正確的位置上,然後將左右兩部分再次進行相同的操作,最終會得到乙個有序的陣列。快速排序的演算法平均時間複雜度為o nlogn 最...