分治 快排 快選

2021-10-04 12:23:09 字數 2963 閱讀 5759

快排模板:

#include

using

namespace std;

const

int n=

1e5+10;

int n,a[n]

;void

quick_sort

(int q,

int l,

int r)

quick_sort

(q,l,j)

;quick_sort

(q,j+

1,r);}

intmain()

快速選擇演算法:選擇長

度為n的

序列中第

k小的數

。理論時

間複雜度

o(n)

。實現步

驟與快排

類似:①

、選擇一

個基準x

,將序列

分成

<=x

的左半部

分和

>=x

的右半部

分。②、

假設左半

部分由s

l個數,

若k

<=s

l,那麼

說明第k

小的數在

左半區間

,否則在

右半區間

。但是需

要注意的

是,若在

右半區間

,整個序

列第k小

的數應當

是右半區

間k−s

l小的數

。這樣,

每層遞迴

需要計算

的次數就

是該層序

列的長度

,與快排

不同的是

,每次僅

需選擇一

個分支。

總的平均

計算次數

t(n)

=n+n

2+n4

+...

=n(1

+12+

14+.

..

)<=2

n,故時

間複雜度

是o(n

)的

。選擇長度為n的序列中第k小的數。理論時間複雜度o(n)。\\ \ \\實現步驟與快排類似:\\①、選擇乙個基準x,將序列分成<=x的左半部分和》=x的右半部分。\\ \ \\②、假設左半部分由s_l個數,若k<=s_l,那麼說明第k小的數在左半區間,否則在右半區間。\\但是需要注意的是,若在右半區間,整個序列第k小的數應當是右半區間k-s_l小的數。\\ \ \\這樣,每層遞迴需要計算的次數就是該層序列的長度,與快排不同的是,每次僅需選擇乙個分支。\\總的平均計算次數t(n)=n+\frac+\frac+...=n(1+\frac+\frac+...)<=2n,故時間複雜度是o(n)的。

選擇長度為n

的序列中

第k小的

數。理論

時間複雜

度o(n

)。實現

步驟與快

排類似:

①、選擇

乙個基準

x,將序

列分成<=x

的左半部

分和>=x

的右半部

分。②、

假設左半

部分由s

l​個數

,若k<=s

l​,那

麼說明第

k小的數

在左半區

間,否則

在右半區

間。但是

需要注意

的是,若

在右半區

間,整個

序列第k

小的數應

當是右半

區間k−

sl​小

的數。這

樣,每層

遞迴需要

計算的次

數就是該

層序列的

長度,與

快排不同

的是,每

次僅需選

擇乙個分

支。總的

平均計算

次數t(

n)=n

+2n​

+4n​

+...

=n(1

+21​

+41​

+...

)<=2

n,故時

間複雜度

是o(n

)的。

例題:

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

輸入格式

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

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

輸出格式

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

資料範圍

1≤n≤100000,

1≤k≤n

輸入樣例:

5 32 4 1 5 3

輸出樣例:

3

**:

#include

using

namespace std;

const

int n=

1e5+10;

int n,k,a[n]

;int

quick_sort

(int l,

int r,

int k)

int sl=j-l+1;

if(k<=sl)

return

quick_sort

(l,j,k)

;else

return

quick_sort

(j+1

,r,k-sl);}

intmain()

分治排序之快排

歸併排序和快排 分而治之排序的方法包括歸併排序和快排,歸併排序partition簡單,merge比較複雜,易分難合併 快排的特點則是 難分易合併 快排首先要先確定中心點pivot的選取規則,pivot把陣列分為兩部分,左邊的數都小於pivot,右邊的數都大於等於pivot,然後左右兩部分繼續快排,直...

分治法例項(快排)

分治法的精髓 分 將問題分解為規模更小的子問題 治 將這些規模更小的子問題逐個擊破 合 將已解決的子問題合併,最終得出 母 問題的解 快速排序原理 從一組數中選出乙個pivot 中心軸 將大於它的數放右邊,小於它的數放左邊,然後再從左邊和右邊的倆組數中分別執行此操作,此時,陣列就是有序的了。crea...

分治 簡單說說快排

說到快拍,大家都會首先想到sort函式這個神奇的東西 但是,我們總得知道快拍主要用的分治思想 所以就說一說快拍吧 首先是分類 快拍主要有三種方式 一 以第乙個數為基準排序 二 以中間的數為基準快排 三 隨機生成乙個位置,用這個位置上的數快排 如下 include include include in...