快速排序,歸併排序

2021-08-17 03:13:53 字數 3490 閱讀 4361

快速排序(quicksort)是對

氣泡排序的一種改進。

設要排序的

陣列是a[0]……a[n-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-完成的時候,此時令迴圈結束)。

假設使用者輸入了如下陣列:

下標0

1

2

3

4

5

資料

6

2

7

3

8

9

建立變數i=0(指向第乙個資料), j=5(指向最後乙個資料), k=6(

賦值為第乙個資料的值)。

我們要把所有比k小的數移動到k的左面,所以我們可以開始尋找比6小的數,從j開始,從右往左找,不斷遞減變數j的值,我們找到第乙個下標3的資料比6小,於是把資料3移到下標0的位置,把下標0的資料6移到下標3,完成第一次比較:

下標0

1

2 34

5

資料

3

2

7

6

8

9

i=0;     j=3;     k=6;

接著,開始第二次比較,這次要變成找比k大的了,而且要從前往後找了。遞加變數i,發現下標2的資料是第乙個比k大的,於是用下標2的資料7和j指向的下標3的資料的6做交換,資料狀態變成下表:

下標0

1

2

3

4

5

資料

3

2

6

7

8

9

i=2;     j=3;     k=6;

稱上面兩次比較為乙個迴圈。

接著,再遞減變數j,不斷重複進行上面的迴圈比較。

在本例中,我們進行一次迴圈,就發現i和j「碰頭」了:他們都指向了下標2。於是,第一遍比較結束。得到結果如下,凡是k(=6)左邊的數都比它小,凡是k右邊的數都比它大:

下標0

1

2

3

4

5

資料

3

2

6

7

8

9

如果i和j沒有碰頭的話,就遞加i找大的,還沒有,就再遞減j找小的,如此反覆,不斷迴圈。注意判斷和尋找是同時進行的。

然後,對k兩邊的資料,再分組分別進行上述的過程,直到不能再分組為止。

注意:第一遍快速排序不會直接得到最終結果,只會把比k大和比k小的數分到k的兩邊。為了得到最後結果,需要再次對下標2兩邊的陣列分別執行此步驟,然後再分解陣列,直到陣列不能再分解為止(只有乙個資料),才能得到正確結果。

#include #include#include#includeusing namespace std;

void qsort(int a, int low, int high)

int first = low;

int last = high;

int key = a[first];/*用字表的第乙個記錄作為樞軸*/

while(first < last)

a[first] = a[last];/*將比第乙個小的移到低端*/

while(first < last && a[first] <= key)

a[last] = a[first];/*將比第乙個大的移到高階*/

}a[first] = key;/*樞軸記錄到位*/

qsort(a, low, first-1);

qsort(a, first+1, high);

}int main()

; int len=sizeof(a) / sizeof(a[0]);///求陣列長度

qsort(a, 0, len-1);

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

printf("%d ",a[i]);

printf("\n");

return 0;

}

在c++中可以用函式qsort()可以直接為陣列進行排序。

用 法:

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

引數:

1 待排序陣列首位址

2 陣列中待排序元素數量

3 各元素的占用空間大小

4 指向函式的指標,用於確定排序的順序

注:它在使用的時候需要包含標頭檔案:#include

樣例:

#include#include#includeusing namespace std;

int comp(const void*a,const void*b)

int main()

}int main()

; mergesort(a,10);

printf("排序後:");

for(i=1; i<10; i++)

printf("\n");

return 0;

}

快速排序 歸併排序

感覺好久之前不寫這些基礎的東西忽然覺著,想複習一下,就簡單溫習一下排序的例子 package com.ruishenh.algoritmic public class sort static void printmsg int arrs system.out.println static int g...

歸併排序,快速排序

快速排序實現 filename fastsort description author hcq createtime 2019 04 12 10 01 public class fastsort arrays.stream arr foreach v system.out.println 排序後 s...

快速排序 歸併排序

1 快速排序 快速排序利用分治的思想,首先選取乙個哨兵,將陣列中大於哨兵的元素放到一邊,小於陣列的元素放到另一邊,然後對兩邊也進行相同的操作。public void quicksort list t private void quicksort list t,int l,int h 將大於哨兵的放到...