通過找出乙個基準數,然後從左向右,從右向左依次找出比這個基準數大(小)的數字,然後交換它倆,
最後將基準數與每輪判斷的結尾處交換,
這樣每輪結束後,剛剛排序的部分都會被分成兩部分,在基準數左邊的數字都比基準數小,在基準數右邊的數字都比基準數大,
然後不斷二分下去,最後整體排序完成 ,此方法主要運用了遞迴與二分
好像貌似說的有點抽象
快速排序的最差時間複雜度是o(n2)
它的平均時間複雜度為o(nlogn)
下面來段正確**
#include
int n,a[
100000];
//定義為全域性變數在要用時就比較方便
void
quicksort
(int left,
int right)
//傳參每次傳進來左邊與右邊的邊界值即可
} a[left]
=a[i]
;//將基準數歸位,此時基準數左邊的比基準數小
//基準數右邊的,比基準數大
a[i]
=temp;
quicksort
(left,i-1)
;//遞迴,不斷處理基準數左邊的部分
quicksort
(i+1
,right)
;//遞迴,不斷處理基準數右邊的部分
}int
main()
好的,現在到了最愛的舉個栗子環節
比如,現在有5個數
輸入之後開始呼叫函式環節,
第一次傳入的left為1,right為5
函式確定了它第一次的基準數為5,
開始尋找了,
j=5,a[5]=8,大於基準數,所以j–,
a[4]=7,大於基準數,j–,
a[3]=2,小於基準數,對於j的迴圈處理退出,
開始i的處理,
i=1,a[1]=5,就是基準數,所以跳過,i++,
a[2]=1,小於基準數i++,
i=3,此時i==j了,退出對i的迴圈處理,
判斷一下i和j的大小,如果i=right再返回上一層函式,然後進入後半段的比較交換,然後成功後函式再拆分再比較,再交換,直至所有的數被排序好,再一層一層退出迴圈,然後得到已經排好序的數列
最後的最後要附上我的錯誤**,關於我的易錯點
#include
int n,a[
100000];
intquicksort
(int left,
int right)
//錯處
} a[left]
=a[i]
; a[i]
=temp;
quicksort
(left,i-1)
;quicksort
(i+1
,right);}
intmain()
關於這個錯處,因為這個函式是沒有返回值的,函式排序的過程已經對陣列進行了更改,所以函式型別用void,不要順手int
再來增加一點,就是搜尋i,j的位置交換時,一定要從j(基準數的對立面)查起,不要先查i,因為從i查起,i 停留的位置一定比基準數大,然後判斷j,j與i相遇時(記此點為交換點),交換點的數一定大於基準數,這樣比基準數大的數最後就會被交換到基準數的左邊
排序演算法第二談 快速排序
把乙個陣列切分成兩個子陣列的基本思想 找乙個基準值,用兩個指標分別指向陣列的頭部和尾部 先從尾部向頭部開始搜尋乙個比基準值小的元素,搜尋到即停止,並記錄指標的位置 再從頭部向尾部開始搜尋乙個比基準值大的元素,搜尋到即停止,並記錄指標的位置 交換當前左邊指標位置和右邊指標位置的元素 重複2,3,4步驟...
第二章 快速排序
快速排序演算法也是基於分治思想的一種排序演算法,它的基本操作即為比較 交換。快速排序演算法的基本思想是從待排序的序列中選取乙個比較標準k 通常選取第乙個元素 然後將其餘元素依次跟k進行比較。在比較的過程中將大於k的元素移到k的後面,將小於k的元素移到k的前面,最後的結果是將原始序列分為兩個子串行,而...
開學第二週 two 快速冪)
時間過得真是快呀,第二週就要結束了,感覺有時自己在瞎忙。關於快速冪及矩陣快速冪的題目,我在寒假就遇見過了,那時一看是新知識點,沒有立即消化吸收,只是簡單收藏在csdn中,想著 抽空再看吧!現在看來這個想法很危險 可是新知識如雨後新竹般,來不及學習的早已埋在收藏中了。唉,明日復明日,明日何其多?要警醒...