上次在面試了一次後臺開發的時候,而後在交流羣裏和小夥伴們交流了一下,發現數據結構和算法手撕代碼是你們的弱點(包括我本身也是,對數據結構和算法也沒有去系統的學習過,這方面很是差勁!),爲此本身趁這段時間比較充裕一點,反正也沒啥事,少刷點視頻,就順便來系統學習基本的數據結構和算法了,多掌握點技能,提升本身的思惟能力,雖然在實際工做當中去寫數據結構或者算法的地方几乎不會用到(固然也跟崗位有關,自身的職業崗位深刻有關。。。),仍是很是值得去學習,只有好處,沒有壞處!linux
今天給你們分享的是快速排序,最爲重要的是學習它的核心思想,其次再是代碼實現!ios
1、快速排序:面試
一、核心思想:算法
(1)、肯定分界點,能夠在上圖中的數軸上隨便找一個點來做爲分界點,固然咱們常規的肯定分界點方法有:微信
a、直接取左邊界,表示爲q[l]數據結構
b、取中間值,表示爲q[(l+r)/2]數據結構和算法
c、取右邊界,表示爲q[r]編輯器
d、這種方法就是隨便取了;不過上面三種方法是咱們經常使用的方法!學習
(2)、調整區間:網站
如上圖因此,咱們把小於等於x的數字放在小於等於x的區間裏面去;把大於等於x的數字放在大於等於x的區間裏面去
(3)、遞歸處理左右兩端區間
二、具體實現細節分分析:
這裏咱們用兩個指針分別爲指針i、指針j,指向數軸上的兩端,以下圖所示:
讓兩個指針都往中間走,這裏咱們先分析指針i,當指針i指到了小於x的數字,就把它分好位置,繼續往下走,直到遇到不符合這個條件,指針i就中止往下訪問了;接着咱們來分析指針j了,方法同樣,當指針j指向的數字大於x的時候,把它分好位置,繼續往下走,直到遇到不符合這個條件,指針j就中止往下訪問了,這時進行兩邊數據互換swap();接着繼續按照這種方式往下訪問,直到排序完成爲止!
這樣說可能還沒聽明白,那麼咱們下面用實際的數字來講話,好比:三、一、二、三、5
這裏咱們取分界點爲3;咱們能夠看到指針i先指向3,它恰好等於3(不知足小於3的條件,這裏的分界點3不要放入到任何的區間去,否則爲啥會叫分界點),因此指針i就先暫停;而後是指針j,咱們從圖中發現它指向的數字大於3,知足條件,因此先把5放置好位置來,而後繼續讓指針j往下走:
這個時候你會發現指針j指向的數字是3,不知足條件,因此進行i和j指向的數字進行交換swap(),這裏都是3,因此看不出啥變化來。
交換完後,繼續按照原來的方式往下走,指針i和指針j指向的數字以下:
這個時候咱們會發現指針i指向的數字是1,因此符合條件,放置好位置來,繼續往下走,你會發現指向數字2,知足條件,一樣放置好位置來,而後繼續往下走,此時指針i指向的數字是3,不知足條件,就中止下來:
這個咱們分析指針j,它此時指向的數字是2,不符合條件,就中止下來,這個時候不能進行交換數據了!
三、代碼實現:
如今咱們就用代碼實現快排實現:
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int q[N];
void quick_sort(int q[], int l, int r)
{
if(l>=r) return;//表示若是隻有一個數或者0個數,就不用進行排序了
//肯定分界點
int x = q[l+r>>1], i = l-1, j = r+1;
//調整區間
while(i<j)
{
do i++;while(q[i]<x);
do j--;while(q[j]>x);
if(i<j)
{
swap(q[i],q[j]);
}
}
//進行遞歸
quick_sort(q,l,j);//先對左半邊遞歸排序
quick_sort(q,j+1,r);//再對右半邊遞歸排序
}
int main()
{
scanf("%d",&n);
for(int i =0; i<n;i++)
{
scanf("%d",&q[i]);
}
quick_sort(q, 0 , n-1);
for(int i =0;i<n;i++)
{
printf("%d ",q[i]);
}
}
結果:
參考:https://www.acwing.com/activity/content/punch_the_clock/11/,網站:AcWing
我是txp,一個只專一於乾貨分享的博主,歡迎隨時來撩我,咱們下期見!更多精彩內容,能夠微信搜索:txp玩linux;qq羣:836108981