快速排序應該算是在面試筆試中最常用的演算法了,各位面試官都非常喜歡。排序效率在同為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,另一部分大於標誌值 公升序 後面部分 各部分內部可以是 通常也是 無序的。通過遞迴地呼叫這樣的排序,使得最終陣列所有的元素有序。一次具體的...