經典演算法學習 快速排序

2022-09-23 13:27:07 字數 1598 閱讀 1827

快速排序應該算是在面試筆試中最常用的演算法了,各位面試官都非常喜歡。排序效率在同為o(n*logn)的幾種排序方法中效率較高,因此經常被採用,其中的思想也是用了分治法和遞迴的思想。示例**上傳到:

演算法的基本思想是:

(1)先從數列中取出乙個數作為基準數(常常選第乙個數);

(2)分割槽過程,比這個數大的數放到它的右邊,小於或等於的數全放到它的左邊;

(3)再對左右區間重複第二步,直到每個區間只有乙個數字置,即左邊界下標等於右邊界下標;

簡化描述為:

1.i= l, j=r,基準數即為a[i],儲存起來;

2.j--,由後向前找比它小的數,找到後將此數放到a[i]中;

3.i++,由前向後找比它大的數,找到後將此數填入到a[j]中;

4.遞迴執行2,3兩步,直到i==j,最後將基準數填入a[i]中;

具體**實現如下:

//// main.c

// quicksort

//// created by chenyufeng on 16/1/27.

// copyright © 2023年 chenyufengweb. all rights reserved.

//#include

int *quicksort(int arr,int l,int r);

void quicksort02(int *arr,int l,int r);

int main(int argc, const char * ar**) ;

//使用指標返回陣列,返回的其實是陣列的頭指標;

/*** 使用返回指標;

*/// int *retarr;

// retarr = quicksort(numarr, 0, 4);

// for (int i = 0; i < 5; i++)

/*** 直接傳遞引用,比較方便;

*/quicksort02(numarr, 0, 4);

for (int i = 0; i < 5; i++)

}int *quicksort(int arr,int l,int r)

if (i < j)

//從基準值左側找出大於基準的值;

while (i < j && arr[i] < x)

if (i < j)

}//把基準值放入arr[i]位置;

arr[i] = x;

//遞迴,左右兩側分別進行快排;

quicksort(arr, l, i - 1);

quicksort(arr, i + 1, r);

}return arr;

}void quicksort02(int *arr,int l,int r)

if (i < j)

//從基準值左側找出大於基準的值;

while (i < j && arr[i] < x)

if (i < j)

}//把基準值放入arr[i]位置;

arr[i] = x;

//遞迴,左右兩側分別進行快排;

quicksort(arr, l, i - 1);

quicksort(arr, i + 1, r);}}

演算法學習 快速排序

快速排序 分治演算法 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,另一部分大於標誌值 公升序 後面部分 各部分內部可以是 通常也是 無序的。通過遞迴地呼叫這樣的排序,使得最終陣列所有的元素有序。一次具體的...