No 3 快速排序

2021-09-20 13:11:24 字數 1120 閱讀 6086

桶排序,浪費空間,氣泡排序,時間複雜度高,「快排」應該是一種比較好的排序演算法,既省空間又降低了時間複雜度,它的時間複雜度是o(nlog⁡n),但是在最壞的情況下它的時間複雜度和氣泡排序一樣為o(n^2)。

假設我們要給「8 2 3 5 1 6 4 10 9 7」這樣一組數排序,利用「快排」。首先從這組數中選出乙個數作為基準數,通常我們選擇第乙個數,然後我們需要將這個序列中所有比基準數大的數放在基準數的右邊,比基準數小的數放在基準數的左邊。

在此序列中,我們選8作為基準數,先從右往左找找乙個比8小的數,再從左往右找找乙個比8大的數,然後把這兩個數進行交換。定義兩個變數i和j,分別指向序列的最左邊的數8和最右邊的數7,然後從右往左找(j–)直到找到乙個比8小的數,然後從左往右找乙個比8大的數(i++)直到找到乙個比8大的數,最後j指向7,i指向10,交換7和10,交換後序列為「8 2 3 5 1 6 47910」,然後j繼續向左找(j–),最後指向7,但是此時i和j指向同乙個位置,所以要將7和基準數8進行交換,讓基準數歸位,第一輪結束後序列為「72 3 5 1 6 489 10」,以8為分界點,再分別對8左邊的數和右邊的數進行上述操作,直到出現不可拆分的新的子串行為止,即所有的數均按要求排好。用c還是很容易實現的,不過程式好像有點問題,不是bug,沒有報錯,它就是傲嬌地不想排而已。

#includeint a[100];//定義乙個陣列用於儲存要排序的數

void quicksort(int left,int right){

int i,j,t,temp;//temp用於臨時儲存選定的基準數

if(left>right)

return;

temp=a[left];//選定要排序序列最左邊的數作為基準數並儲存在變數temp中

i=left;//i,j分別處於序列的最左邊和最右邊的位置

j=right;

while(i!=j){

//從右邊向左邊開始找

while(a[j]>=temp && i「快排」比氣泡排序快是因為它每次交換都是跳躍式的,而氣泡排序每次只能讓相鄰的進行交換,所以「快排」交換次數少,效率高,但是最壞的情況就是每次只能交換相鄰的數,這就和氣泡排序一樣了。

No 3拓撲排序和關鍵路徑

一.aov網和拓撲排序 以頂點表示活動,有向邊表示活動之間的優先關係 則稱 這樣的有向圖為 aov網 頂點活 特點 乙個aov網必定是乙個有向無環圖,即不應該帶有迴路。將有向無環圖 g中所有頂點排成乙個 序列,使得圖中任意一對頂點u和 v,若,v e g 則u v之前。這樣的線性序列稱為滿足拓撲次序...

祝福簡訊NO 3

1 好笑嗎?身邊沒你,好怪,陪我一生一世好嗎?2 我不要短暫的溫存,只要你一世的陪伴 3 只因你太美好令我無法坦白說出我愛你 4 我的貓很皮,可不可以幫我管它.5 我希望睡前最後看到的是你.6 請你當我手心裡的寶 7 不知道愛你算不算是乙個貼心的理由?8 我想要和你一起慢慢變老 9 我想在一百年之後...

排序(3) 快速排序

最近去面試,都考到了排序,考的比較多的是快速排序,發現自己 實現能力還是很次啊,趕緊抓緊學起來 選擇乙個基準元素 通常是第乙個元素或者最後乙個元素,當然也可以選擇幾個值的均值或中值,例如,取第乙個,中間的,最後乙個的中值 通過一趟掃瞄,將待排序的分成兩部分,一部分比基準元素小,一部分大於基準元素。此...