第二週(快速排序)

2021-10-01 06:24:49 字數 1859 閱讀 3856

通過找出乙個基準數,然後從左向右,從右向左依次找出比這個基準數大(小)的數字,然後交換它倆,

最後將基準數與每輪判斷的結尾處交換,

這樣每輪結束後,剛剛排序的部分都會被分成兩部分,在基準數左邊的數字都比基準數小,在基準數右邊的數字都比基準數大

然後不斷二分下去,最後整體排序完成 ,此方法主要運用了遞迴二分

好像貌似說的有點抽象

快速排序的最差時間複雜度是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中,想著 抽空再看吧!現在看來這個想法很危險 可是新知識如雨後新竹般,來不及學習的早已埋在收藏中了。唉,明日復明日,明日何其多?要警醒...