快速排序 分治 C語言)

2021-10-07 18:56:30 字數 2491 閱讀 9594

基本思想

將陣列劃分為兩個部分,然後分別對兩個部分進行排序;首先隨機選q[left]作為劃分元素,這個元素劃分後將在最開始的位置上,從陣列的右端開始掃瞄,直到找到乙個小於劃分元素的元素,再從素組的左端開始掃瞄,直到找到乙個大於劃分元素的元素,使掃瞄停止的兩個元素,顯然在最終的素組中是位置相反,於是交換這兩個數的元素,繼續這一過程,這樣就可以保證素組位於左側的指標的元素都比劃分元素小,位於右側指標的元素都比劃分元素大,然後再將左右兩段分別遞迴排序。

基本步驟

1.確定分界點(可以選擇中間位置值或者隨機位置值)

2.調整區間使分界點左側值不大於分界點值,分界點右側值不小於分界點值

3.遞迴處理分界點左右兩側區間

基本模組

**於yxc

void

quick_sort

(int q,

int l,

int r)

}quick_sort

(q, l, j)

;quick_sort

(q, j +

1, r)

;}

細節注意

1.i, j 都要從兩端外一格開始,確保移動時能夠指向真正的邊界

2.注意邊界問題

經典例題

1、給定你乙個長度為n的整數數列。

請你使用快速排序對這個數列按照從小到大進行排序。

並將排好序的數列按順序輸出。

輸入格式

輸入共兩行,第一行包含整數 n。

第二行包含 n 個整數(所有整數均在1~109範圍內),表示整個數列。

輸出格式

輸出共一行,包含 n 個整數,表示排好序的數列。

資料範圍

1≤n≤100000

輸入樣例:

53 1 2 4 5

輸出樣例:

1 2 3 4 5

c語言解答

#include

#include

#define n 100010

int n;

int q[n]

;void

quick_sort

(int q,

int l,

int r)

}quick_sort

(q, l, j)

;//對分界點左側進行遞迴排序

quick_sort

(q, j +

1, r)

;//對分界點右側進行遞迴排序

}int

main()

2、給定乙個長度為n的整數數列,以及乙個整數k,請用快速選擇演算法求出數列的第k小的數是多少。

輸入格式

第一行包含兩個整數 n 和 k。

第二行包含 n 個整數(所有整數均在1~109範圍內),表示整數數列。

輸出格式

輸出乙個整數,表示數列的第k小數。

資料範圍

1≤n≤100000,

1≤k≤n

輸入樣例:

5 32 4 1 5 3

輸出樣例:

3

#include

#include

#define n 100010

int n,k;

int q[n]

;void

quick_sort

(int q,

int l,

int r)

}quick_sort

(q, l, j)

;//對分界點左側進行遞迴排序

quick_sort

(q, j +

1, r)

;//對分界點右側進行遞迴排序

}int

main()

#include

using

namespace std;

const

int n =

100010

;int q[n]

;int

quick_sort

(int q,

int l,

int r,

int k)

if(j - l +

1>= k)

return

quick_sort

(q, l, j, k)

;else

return

quick_sort

(q, j +

1, r, k -

(j - l +1)

);}int

main()

39785

/

分治 快速排序

快速排序陣列元素的思想 1 設k a 0 將k挪到適當位置,使得比k小的元素都在k左邊,比k大的元素都在k右邊,和k相等的,不關心在k左右出現均可 o n 時間完成 2 把k左邊的部分快速排序 3 把k右邊的部分快速排序 class program quicksort a,0,a.length 1 ...

分治 快速排序

快速排序陣列元素的思想 1 設k a 0 將k挪到適當位置,使得比k小的元素都在k左邊,比k大的元素都在k右邊,和k相等的,不關心在k左右出現均可 o n 時間完成 2 把k左邊的部分快速排序 3 把k右邊的部分快速排序 class program quicksort a,0,a.length 1 ...

快速排序 分治

我之前有寫過相關快速排序的,但是因為當時對遞迴和分治的思維還是不夠熟悉。所以對快速排序一知半解,現在再來做乙個總結 首先快速排序步驟如下 1,設k a 0 將k挪到適當的位置,使得比k小的元素在k的左邊,比k大的元素在k的右邊,和k是相等的,不關心在k左右均可。2,對k的左邊進行快速排序 3,對k的...