快速排序演算法手工實現及qsort sort運用

2021-09-30 14:04:37 字數 2539 閱讀 6457

快速排序演算法手工實現及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: 待排序陣列的首位址

low: 第乙個元素的陣列下標

high: 最後乙個元素的陣列下標

2. c語言中qsort排序

用法:

void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
引數:

base: 待排序陣列首位址

nelem: 陣列中待排序元素數量

width: 各元素的占用空間大小

fcmp: 指向函式的指標,用於確定排序的順序(必須自己編寫,不可預設)

3. c++中的sort排序

用法:

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小的值,以此類推,直到...