快速排序是一種效率很高的排序演算法,也是我們使用最多的一種排序演算法。
快速排序原理:
兩個指標分別指向陣列兩頭元素,將陣列第乙個元素儲存下來,作為基準數,兩個指標開始向中間移動,先移動陣列尾部指標,直到發現所指元素比基準數小時,將這時候所指向的數賦值給陣列頭部指標指向的位置,然後尾部指標停止移動,頭部指標開始移動,直到移動到所指向的元素比基準元素大時,將此時所指向的元素賦值給尾部指標所指向的位置,頭部指標停止移動,尾部指標再次開始移動,如此往復,當兩個指標位置重合時,停止移動,將基準元素的值賦值給此時所指向的位置,第一次移動結束。此時將陣列分為以基準元素左和右兩個陣列,分別遞迴進行上面的操作,直到得出最後的有序數列。
例:
有一組數列 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 最...