演算法學習(一) 快速排序

2022-09-20 04:12:13 字數 1412 閱讀 8463

快速排序演算法是對包含n個數的輸入陣列進行排序,演算法的期望時間為θ(nlgn),最壞的執行時間為θ(n
2

),並且其使用就地排序。
舉個例子 對陣列a[p..r]排序可分成以下三個步驟:

分解:陣列a[p..r]劃分成a[p..q-1]和a[q+1..r],使得a[p..q-1]中的每個元素都小於等於a[q],而且小於等於a[q+1..r]中的元素;

解決:通過遞迴呼叫快速排序,對陣列a[p..q-1]和a[q+1..r]進行排序;

合併:因為兩個陣列時就地排序,可以將它們直接合併

下面是快速排序的過程

quicksort(a, p, r)

if p < r

then q ←

partition(a, p, r)

quicksort(a, p, q-1

) quicksort(a, q+1, r)

細化quicksort(a, p, r)
partition(a, p, r)

x ←a[r]

i ← p-1

for j ← p to r-1do

if a[j] <=x

then i ← i+1exchange a[i] ↔

a[j]

exchange a[i+1] ↔a[r]

return i+1

官方經典快速排序演算法
#include 

#include

#define num_items 100

void quicksort(int numbers, int

array_size);

void q_sort(int numbers, int left, int

right);

intnumbers[num_items];

intmain()

void quicksort(int numbers, int

array_size)

void q_sort(int numbers, int left, int

right)

while ((numbers[left] <= pivot) && (left left++;

if (left !=right)

} numbers[left] =pivot;

pivot =left;

left =l_hold;

right =r_hold;

if (left q_sort(numbers, left, pivot-1

);

if (right >pivot)

q_sort(numbers, pivot+1

, right);

}

演算法學習 快速排序

快速排序 分治演算法 const int n 1e6 10 int a n a 待排序陣列,l 排序陣列的起始下標,r 排序陣列的結束下標 void quick sort int a,int l,int r 遞迴的終止條件 int x a l 選取排序的比較物件 int i l 1 設定排序的左指標...

演算法學習 快速排序

1 基本思想 取待排序陣列第乙個數作為參照數,建立left和right陣列,left儲存小於參照數的陣列集合,right儲存大於參照數的陣列集合,然後分別對left和right進行遞迴呼叫排序。2 舉例 11,2,3,43,23,5,6,9,10 取任意的乙個數為基準數 temp arr 0 遍歷陣...

排序演算法學習 快速排序

快速排序 作為氣泡排序的一種改進 通過設定乙個標誌值 通常為陣列第乙個元素pivot 一次快排將陣列分成兩個部分,一部分 公升序 前一部分 小於標誌值pivot,另一部分大於標誌值 公升序 後面部分 各部分內部可以是 通常也是 無序的。通過遞迴地呼叫這樣的排序,使得最終陣列所有的元素有序。一次具體的...