快速排序演算法手工實現及qsort、sort運用
1. 快速排序演算法
(1) 設定兩個變數i、j,排序開始的時候:i=0,j=n-1;示例(2) 以第乙個陣列元素作為關鍵資料,賦值給key,即key=a[0];
(3) 從j開始向前搜尋,即由後開始向前搜尋(j--),找到第乙個小於key的值a[j],將a[j]和a[i]互換;
(4) 從i開始向後搜尋,即由前開始向後搜尋(i++),找到第乙個大於key的a[i],將a[i]和a[j]互換;
(5) 重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中a[j]不小於key,4中a[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i++或j--完成的時候,此時令迴圈結束)。
下標012
345資料
6273
89
下標012
345資料
3276
89
下標012
345資料
3267
89稱上面兩次比較為乙個迴圈。
在本例中,我們進行一次迴圈,就發現i和j「碰頭」了:他們都指向了下標2。於是,第一遍比較結束。得到結果如下,凡是k(=6)左邊的數都比它小,凡是k右邊的數都比它大:下標0
1234
5資料32
6789
如果i和j沒有碰頭的話,就遞加i找大的,還沒有,就再遞減j找小的,如此反覆,不斷迴圈。注意判斷和尋找是同時進行的。
然後,對k兩邊的資料,再分組分別進行上述的過程,直到不能再分組為止。
注意:第一遍快速排序不會直接得到最終結果,只會把比k大和比k小的數分到k的兩邊。為了得到最後結果,需要再次對下標2兩邊的陣列分別執行此步驟,然後再分解陣列,直到陣列不能再分解為止(只有乙個資料),才能得到正確結果。
手工quicksort排序
用法:
void quicksort(int a,int low,int high);引數:
a: 待排序陣列的首位址2. c語言中qsort排序low: 第乙個元素的陣列下標
high: 最後乙個元素的陣列下標
用法:
void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));引數:
base: 待排序陣列首位址3. c++中的sort排序nelem: 陣列中待排序元素數量
width: 各元素的占用空間大小
fcmp: 指向函式的指標,用於確定排序的順序(必須自己編寫,不可預設)
用法:
void sort(void *begin,void *end,bool (*compare)(void a,void b));引數:
begin: 待排序陣列的首位址示例**end: 待排序陣列最後乙個元素的位址
compare: 比較函式,確定排序的順序(可預設,預設為公升序)
#include
#include//c中的排序函式qsort的標頭檔案
#include//c++中排序函式sort的標頭檔案
using
namespace
std;
#define maxn 1000005
int a[maxn];
//當用c語言內建函式qsort排序時呼叫的比較函式
int fcmp(const
void *a, const
void *b) //編寫比較函式,公升序排列
//當用c++內建函式sort排序時呼叫的比較函式
bool compare(int a,int b) //可以對任意型別進行排序
//手工編寫quicksort函式實現快速排序
void quicksort(int a,int low,int high) //思想就是取乙個數作為key,經過一輪快速排序後,
a[first]=a[last]; //將比第乙個小的移到低端
while(first//向後尋找
}a[last]=a[first]; //將比第乙個大的移到高階
}a[first]=key; //樞軸記錄到位(替換迴圈結束時first指向的字表)
quicksort(a,low,first-1);
quicksort(a,first+1,high);
}int main()
排序演算法 快速排序原理及Java實現
和以前的寫法對比,基準值所在的位置沒必要每次都進行交換,只在一次快排完成後,重新把當前的基準值賦值給現在的index位置就好了。寫的很強,感謝作者 public class quicksort i low j hight index a i 用子表的第乙個記錄做基準 while i j a i in...
排序演算法 快速排序解析及Python實現
1.1 分而治之 divide and conquer 一種遞迴式方法 1.2 找出基線條件,這種條件必須盡可能簡單 1.3 不斷將問題分解為簡單問題,直到問題滿足極基線條件 假設陣列的長度為0 7這8個數字,且亂序排序,並且每次取正中間的值作為基線值 basevalue 那麼可結合二分查詢的思想可...
快速排序演算法及優化(Java實現)
快速排序思想 1.找基準 定義high,low,temp,先讓tmp low值,從high位置開始找比tmp小的值,沒有就high 有就讓low值等於high值,然後從low位置開始找比tmp大的值,沒有就low 有就讓high值等於low值,然後又從high位置開始找比tmp小的值,以此類推,直到...