快排模板:
#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...