教你學習快速排序算法-程序員必備哦

舉個例子

排序這個序列:6 1 2 7 9 3 4 5 10 8

  • 步驟1:選擇一個基準數(shù)作為對比的開始值昭殉,這里選擇第一個數(shù)6:
  • 步驟2、先從右往左找一個小于 6 的數(shù)郁稍,再從左往右找一個大于 6 的數(shù)烙心。
  • 步驟3、然后交換他們

變成這樣子:

繼續(xù)執(zhí)行步驟2和3拙已,直到兩個哨兵相遇,:


左右兩個哨兵都走到3:


  • 步驟4:將開始選擇基準數(shù)字6換到中間摧冀,測試6左邊的數(shù)都小于6倍踪,右邊的數(shù)都大于6。完成第一次循環(huán):

第一次完成之后索昂,再按照此方法分別對6左右兩邊的數(shù)列進行遞歸排序即可建车。是不是很簡單。

看下代碼就更清晰了:

void quicksort(int a[], int left,int right)
    {
        int i,j,t,temp;
        if(left>right)
            return;

        temp=a[left]; //temp中存的就是基準數(shù)
        i=left;
        j=right;
        while(i!=j)
        {
            //順序很重要椒惨,要先從右邊開始找
            while(a[j]>=temp && i<j)
                j--;
            //再找右邊的
            while(a[i]<=temp && i<j)
                i++;
            //交換兩個數(shù)在數(shù)組中的位置
            if(i<j)
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
        //最終將基準數(shù)歸位
        a[left]=a[i];
        a[i]=temp;

        quicksort(a, left,i-1);//繼續(xù)處理左邊的缤至,這里是一個遞歸的過程
        quicksort(a, i+1,right);//繼續(xù)處理右邊的 ,這里是一個遞歸的過程
    }

也可以這么寫:

/**
     * 快排
     * @param arr
     * @param low
     * @param high
     * @return
     */
    public static int[] quit(int arr[], int low, int high) {
        int l = low;
        int h = high;
        int key = arr[l];  //先找出一個數(shù)作為基準數(shù)(這里取數(shù)組最中間的一位)

        while (l < h) {
            while (l < h && arr[h] >= key) h --; //從后向前:尋找比基準數(shù)小的數(shù)據(jù)康谆,如果找到领斥,停下來
            if (l < h) {  //“探測”到了符合要求的數(shù)據(jù),則交換數(shù)據(jù)沃暗,繼續(xù)順著方向?qū)ふ?                arr[l] = arr[h];
                l ++;
            }
            while (l < h && arr[l] <= key) l ++; //從前向后:尋找比基準數(shù)大的數(shù)據(jù)月洛,如果找到,停下來
            if (l < h) { ////“探測”到了符合要求的數(shù)據(jù)描睦,則交換數(shù)據(jù)膊存,繼續(xù)順著方向?qū)ふ?                arr[h] = arr[l];
                h --;
            }
        }
        arr[l] = key;
        if (l > low) quit(arr, low, l - 1);
        if (h < high) quit(arr, h + 1, high);
        return arr;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末导而,一起剝皮案震驚了整個濱河市忱叭,隨后出現(xiàn)的幾起案子隔崎,更是在濱河造成了極大的恐慌,老刑警劉巖韵丑,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爵卒,死亡現(xiàn)場離奇詭異,居然都是意外死亡撵彻,警方通過查閱死者的電腦和手機钓株,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陌僵,“玉大人轴合,你說我怎么就攤上這事⊥攵蹋” “怎么了受葛?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長偎谁。 經(jīng)常有香客問我总滩,道長,這世上最難降的妖魔是什么巡雨? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任闰渔,我火速辦了婚禮,結(jié)果婚禮上铐望,老公的妹妹穿的比我還像新娘冈涧。我一直安慰自己,他們只是感情好正蛙,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布炕舵。 她就那樣靜靜地躺著,像睡著了一般跟畅。 火紅的嫁衣襯著肌膚如雪咽筋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天徊件,我揣著相機與錄音奸攻,去河邊找鬼。 笑死虱痕,一個胖子當著我的面吹牛睹耐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播部翘,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼硝训,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窖梁,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤赘风,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纵刘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邀窃,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年假哎,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞬捕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡舵抹,死狀恐怖肪虎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惧蛹,我是刑警寧澤笋轨,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站赊淑,受9級特大地震影響爵政,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陶缺,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一钾挟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饱岸,春花似錦掺出、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至百框,卻和暖如春闲礼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铐维。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工柬泽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫁蛇。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓锨并,卻偏偏與公主長得像,于是被迫代替她去往敵國和親睬棚。 傳聞我的和親對象是個殘疾皇子第煮,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 簡單來說解幼,時間復雜度指的是語句執(zhí)行次數(shù),空間復雜度指的是算法所占的存儲空間 時間復雜度計算時間復雜度的方法: 用常...
    Teci閱讀 1,098評論 0 1
  • 高快省的排序算法 有沒有既不浪費空間又可以快一點的排序算法呢包警?那就是“快速排序”啦撵摆!光聽這個名字是不是就覺得很高端...
    博弈史密斯閱讀 407評論 0 0
  • 在Java數(shù)據(jù)結(jié)構(gòu)和算法(三)——冒泡、選擇揽趾、插入排序算法中我們介紹了三種簡單的排序算法台汇,它們的時間復雜度大O表示...
    IT可樂閱讀 483評論 1 1
  • 假設(shè)我們現(xiàn)在對“6 1 2 7 9 3 4 5 10 8”這個10個數(shù)進行排序苛骨。首先在這個序列中隨便...
    小陳阿飛閱讀 868評論 0 1
  • 轉(zhuǎn)自 坐在馬桶上看算法:快速排序轉(zhuǎn)自 坐在馬桶上看算法:快速排序算法的精髓在于篱瞎,跟它一比高數(shù)也顯得那么生動活潑…。...
    Wide_Star閱讀 243評論 0 0