通俗易懂的快排!

上次在面試了一次後臺開發的時候,而後在交流羣裏和小夥伴們交流了一下,發現數據結構和算法手撕代碼是你們的弱點(包括我本身也是,對數據結構和算法也沒有去系統的學習過,這方面很是差勁!),爲此本身趁這段時間比較充裕一點,反正也沒啥事,少刷點視頻,就順便來系統學習基本的數據結構和算法了,多掌握點技能,提升本身的思惟能力,雖然在實際工做當中去寫數據結構或者算法的地方几乎不會用到(固然也跟崗位有關,自身的職業崗位深刻有關。。。),仍是很是值得去學習,只有好處,沒有壞處!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

相關文章
相關標籤/搜索