基本步驟:
1、確定分界點x(a[l],a[r],a[l+r>>1])
2、劃分區間(小於x的在一邊,大於x的在另一邊)
3、遞迴處理左右兩端
const
int n =
1e5+5;
int n,a[n]
;void
quick_sort
(int a,
int l,
int r)
quick_sort
(a,l,j)
;quick_sort
(a,j+
1,r);}
intmain()
巧用快排:求陣列中第k小的數
因為快排過程中選取分界點x排序後,那麼陣列左邊的數都小於等於x,右邊的數都大於等於x,假設陣列左邊有m個數,前m小的數都在左邊
如果m>=k,那麼第k小的數在左邊,往左遞迴
否則,第k小的數在右邊,並且在是右邊第k-m小的數
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define ull unsigned long long
#define up_b upper_bound
#define low_b lower_bound
#define m_p make_pair
#define mem(a) memset(a,0,sizeof(a))
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define inf 0x3f3f3f3f
#include
using
namespace std;
inline ll read()
while
('0'
<=ch&&ch<=
'9') x=x*
10+ch-
'0', ch=
getchar()
;return f*x;
}const
int n =
1e5+5;
int n,k,a[n]
;int
quick_sort
(int l,
int r,
int k)
int nums=j-l+1;
//左邊的個數
if(nums>=k)
quick_sort
(l,j,k)
;else
quick_sort
(j+1
,r,k-nums);}
intmain()
快速排序學習筆記
學習資料出處 白話經典演算法系列之六 快速排序 快速搞定 快速排序採用分治策略,其基本思想 1 從數列中選乙個元素x作為基準數 2 分割槽過程,把不小於x的元素放到x的右邊,小於x的元素放到x的左邊 3 再對左右區間重複進行分割槽操作,直到各區間只有乙個數 morewindows總結的 挖坑填數 分...
學習筆記 快速排序
將乙個一維陣列從小到大排列。快速排序利用了遞迴的思想。需要三個引數,陣列本身,陣列起始索引也就是0,陣列最右索引,也就是陣列長度 1。簡單來說,快速排序的思想是這樣的,先選擇乙個數作為基準數,把比它小的都移動到左邊,把比它大的都移動到右邊,然後針對左邊這個子陣列,再選擇乙個基準數,比它小的移到左邊,...
快速排序學習筆記
一些廢話 今天在刷題的時候遇到了一道要求比較複雜的排序的題,用sort不能實現,需要手打快排。做完後來我的部落格翻了一下竟然沒寫過快排的隨筆,現在把它填上。大家都知道,在c 中,有乙個非常好用的函式sort 使用它只需要包括的標頭檔案即可。但是在某些情況下,僅僅使用sort 函式並不能充分滿足我們的...