排序演算法之快速排序

2022-03-11 12:12:39 字數 1456 閱讀 2786

快速排序(quicksort)是對氣泡排序的一種改進。

基本思想:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

設要排序的陣列是a[0]……a[n-1],首先任意選取乙個資料(通常選用第乙個資料)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。

一趟快速排序的演算法是:

1)設定兩個變數i、j,排序開始的時候:i=0,j=n-1;

2)以第乙個陣列元素作為關鍵資料,賦值給key,即key=a[0];

3)從j開始向前搜尋,即由後開始向前搜尋(j=j-1即j--),找到第乙個小於key的值a[j],a[j]與a[i]交換;

4)從i開始向後搜尋,即由前開始向後搜尋(i=i+1即i++),找到第乙個大於key的a[i],a[i]與a[j]交換;

5)重複第3、4、5步,直到 i=j; (3,4步是在程式中沒找到時候j=j-1,i=i+1,直至找到為止。找到並交換的時候i, j指標位置不變。另外當i=j這過程一定正好是i+或j-完成的最後令迴圈結束。)

下面的過程實現快速排序:

quicksort(a,p,r)

1 ifp

thenq ←partition(a,p,r)

3 quicksort(a,p,q-1)  

4 quicksort(a,q+1

,r)  為排序乙個完整的陣列a,最初的呼叫是quicksort(a,

1,length[a])。

快速排序演算法的關鍵是partition過程,它對子陣列a[p..r]進行就地重排:

partition(a,p,r)  1

x ← a[r]

2 i ← p-1

3 forj ← ptor-14do

ifa[j]≤x

5 theni← i+1

6exchange a[i]←→a[j]

7 exchange a[i+1

]←→a[r]

8 returni+1

快速排序演算法實現:

void quicksort(int s, int l, int

r) s[i] =x;

quick_sort(s, l, i - 1); //

遞迴呼叫

quick_sort(s, i + 1

, r);}}

排序演算法之快速排序

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

排序演算法之快速排序

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

排序演算法之快速排序

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