排序演算法之快速排序

2021-07-28 14:49:59 字數 2539 閱讀 4600

已公升序為例,取乙個數為中位數,比這個數小的放到左邊,比這個數大的放到右邊。

31, 12, 5, 57, 2, 31, 90, 32, 95,76

比較31和76,31小於76。

31, 12, 5, 57, 2, 31, 90, 32,95, 76 比較31和95,31小於95。

31, 12, 5, 57, 2, 31, 90,32, 95, 76 比較31和32,31小於32。

31, 12, 5, 57, 2, 31,90, 32, 95, 76 比較31和90,31小於90。

31, 12, 5, 57, 2,31, 90, 32, 95, 76 比較31和31,31等於31。

31, 12, 5, 57,2, 31, 90, 32, 95, 76 比較31和2,31大於2。31和2進行交換。

2 , 12, 5, 57, 31, 31, 90, 32, 95, 76 比較12和31,12小於31。

2, 12, 5, 57, 31, 31, 90, 32, 95, 76 比較5和31,5小於31。

2, 12, 5,57, 31, 31, 90, 32, 95, 76比較57和31,57大於31。57與31進行交換。

2, 12, 5,31, 57, 31, 90, 32, 95, 76 此時i==

j,31就固定了下來。第一次結束。

看31左邊

2, 12,5, 31, 57, 31, 90, 32, 95, 76 比較2和5,2小於5。

2,12, 5, 31, 57, 31, 90, 32, 95, 76 比較2和12,2小於12。

2, 12, 5, 31, 57, 31, 90, 32, 95, 76此時i==j,2固定了下來。第二次結束。

2左邊沒有資料了,看2到31的這塊

2,12, 5, 31, 57, 31, 90, 32, 95, 76比較12和5,12大於5。12和5進行交換。

2,5, 12

, 31, 57, 31, 90, 32, 95, 76此時i==j,12固定了下來。第三次結束。

2右邊 12左邊這塊

2,5, 12, 31, 57, 31, 90, 32, 95, 76此時i==j,5固定了下來。第四次結束。

看31(左邊的31)的右面

2,5, 12, 31, 57, 31, 90, 32, 95, 76

比較57和76,57小於76。

2,5, 12, 31, 57, 31, 90, 32, 95, 76 比較57和95,57小於95。

2,5, 12, 31, 57, 31, 90, 32, 95, 76 比較57和32,57大於32。57和32進行交換。

2,5, 12, 31, 32, 31, 90, 57, 95, 76 比較31和57,31小於57。

2,5, 12, 31, 32, 31, 90, 57, 95, 76 比較90和57,90大於57。90和57進行交換。

2,5, 12, 31, 32, 31, 57, 90, 95, 76 此時i==j,57固定了下來。第五次結束。

看左邊31到57這個塊

2,5, 12, 31, 32, 31, 57, 90, 95, 76 比較32和31,32大於31。32和31進行交換。

2,5, 12, 31, 31, 32, 57, 90, 95, 76 此時i==j,32固定了下來。第六次結束。

左邊31到32這個塊

2,5, 12, 31, 31, 32, 57, 90, 95, 76 此時i==j,31固定了下來。第七次結束。

看 57右邊這個塊

2,5, 12, 31, 31, 32, 57, 90, 95, 76

比較90和76,90大於76。90和76進行交換。

2,5, 12, 31, 31, 32, 57, 76,95, 90

比較95和90,95大於90。95和90進行交換。

2,5, 12, 31, 31, 32, 57, 76,90, 95

此時i==j,95固定了下來。第八次結束。

看57到

95這個塊

2,5, 12, 31, 31, 32, 57, 76, 90, 95 比較76和90,76小於90。

2,5, 12, 31, 31, 32, 57, 76, 90, 95 此時i==j,76固定了下來。第九次結束。

看 76到95這個塊

2,5, 12, 31, 31, 32, 57, 76,90, 95 此時i==j,90固定了下來。第十次結束。

void quicksort(int a, int low, int high)

if (left < right)

while (left < right&&a[left] <= num)

if (left < right)

}a[left] = num;

quicksort(a, low, left - 1);

quicksort(a, left + 1, high);

}}

快速排序是不穩定的排序,受中位數的影響,平均時間複雜度為o(nlog2n)。

排序演算法之快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...

排序演算法之快速排序

快速排序入口 public void quicksort int lists 遞迴呼叫該函式。原理 每次從陣列從選乙個標兵 本實現為簡單起見直接選取給定範圍內的第乙個元素為標兵 讓後在給定範圍內進行雙向遍歷,目的是以標兵為分界線,將所有小於標兵值的數字排一邊,將所有大於標兵的數字 放到另一邊。標兵移...

排序演算法之快速排序

快速排序是一種不穩定的排序演算法,它的基本思想是,以某個元素為基準,將所有大於等於它的值放在右邊,小於它的值放在左邊,這樣陣列就被分為兩部分,遞迴對這兩部分進行快速排序,而單個元素我們認為是已經排好序的。這是一種歸併思想,當然在最後一步,合併,我們什麼也沒有做也不用做。每一次排序都有乙個元素被放在正...