分治算法之——快速排序算法(C++實現(xiàn))

快速排序是分治策略喷屋、迭代的典型示例苏研,需要熟練掌握。

核心思想

將數(shù)組中所有元素都跟一個基準元素x比(隨意選取欲诺,常取第一個或最后一個)抄谐,比x小的劃分成左邊一塊,比x大的劃分成右邊一塊扰法,得到兩個子問題蛹含。然后遞歸處理這兩個子問題即可。

其關鍵在于對數(shù)組的劃分塞颁。

quick_sort.gif

代碼實現(xiàn)

下面是C++實現(xiàn)代碼:
代碼參考:常用算法之----快速排序

#include <iostream>
using namespace std;

//數(shù)組打印
void P(int a[],int n)
{
    for(int i=0; i<n; i++)
        cout<<a[i]<<" ";
    cout<<endl;
}

int quickSortPartition(int s[], int l, int r){
    //Swap(s[l], s[(l + r) / 2]); //若以中間數(shù)為基準浦箱,則先將中間的這個數(shù)和第一個數(shù)交換即可
    int i = l, j = r, x = s[l]; //將最左元素記錄到x中
    while (i < j)
    {
        // 從右向左找第一個<x的數(shù)
        // 無需考慮下標越界
        while(i < j && s[j] >= x)
            j--;
        if(i < j)
            s[i++] = s[j]; //直接替換掉最左元素(已在x中存有備份)
        
        // 從左向右找第一個>x的數(shù)
        while(i < j && s[i] <= x)
            i++;
        if(i < j)
            //替換掉最右元素(已在最左元素中有備份)
            //最左元素一定被覆蓋過,若沒有殴边,則表明右側所有元素都>x憎茂,那么算法將終止
            s[j--] = s[i];
    }
    s[i] = x;  //i的位置放了x珍语,所以其左側都小于x锤岸,右側y都大于x
    return i;
}

void quickSort(int s[], int l, int r)
{
    //數(shù)組左界<右界才有意義,否則說明都已排好板乙,直接返回即可
    if (l>=r){
        return;
    }
    
    // 劃分是偷,返回基準點位置
    int i = quickSortPartition(s, l, r);
    
    // 遞歸處理左右兩部分,i處為分界點募逞,不用管i了
    quickSort(s, l, i - 1);
    quickSort(s, i + 1, r);
}

int main()
{
    int a[]= {72,6,57,88,60,42,83,73,48,85};
    //int a[]= {10,9,8,7,6,5,4,3,2,1};
    P(a,10);
    quickSort(a,0,9);//注意最后一個參數(shù)是n-1
    P(a,10);
    return 0;
}

這個版本算法的優(yōu)點是蛋铆,不用將某兩個元素互換,一次移動直接將留有備份的元素覆蓋放接。其實刺啦,從兩頭交替掃描就是為了一次挪一個,騰出來坑后再填下一個纠脾。

也可以從一頭單向掃描玛瘸,那時就需要交換倆元素位置。(參考《算法導論》第2版第七章快速排序)


《算法導論》中的快速排序偽代碼苟蹈,劃分過程為單向掃描

復雜度分析

以比較運算作為基本運算糊渊,衡量其時間復雜度T(n)。

由于每次將原問題劃分成兩個規(guī)模減半的子問題慧脱,劃分的額外工作量為O(n)渺绒,所以其遞推公式為:
T(n) = 2 * T(n/2) + O(n)
T(1) = 0

根據(jù)主定理(或迭代、或遞歸樹)可得,T(n) = O( nlog(n) )宗兼。(算法復雜度中的log默認指以2為底的log2)

快排為什么快(分治策略好在哪)

相比之下躏鱼,選擇排序、插入排序殷绍、冒泡排序等的時間復雜度均為O(n^2)挠他。為什么采用分治策略的快速排序能將復雜度大大減小呢?分成兩個子問題后節(jié)省了哪些時間呢篡帕?

因為劃分后殖侵,兩個子問題之間存在某種關系,這些信息節(jié)省了后續(xù)處理時間镰烧。

以快速排序算法為例拢军,數(shù)組中所有元素都跟基準元素x比較后,比x小的劃分成左邊一塊怔鳖,比x大的劃分成右邊一塊茉唉。

這樣,雖然左右兩部分元素沒有直接對比(都只和x做了對比)结执,但已經(jīng)可以知道度陆,x左側的所有元素都小于右側的。

一趟對比下來献幔,每個元素不僅確定了和x的大小關系懂傀,還有了較大、較小之分蜡感。這就比蠻力兩兩對比(比如選擇排序蹬蚁、插入排序、冒泡排序)節(jié)省了時間郑兴。

擴展資料:十大經(jīng)典排序算法(動圖演示)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犀斋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子情连,更是在濱河造成了極大的恐慌叽粹,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件却舀,死亡現(xiàn)場離奇詭異虫几,居然都是意外死亡,警方通過查閱死者的電腦和手機禁筏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門持钉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人篱昔,你說我怎么就攤上這事每强∈继冢” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵空执,是天一觀的道長浪箭。 經(jīng)常有香客問我,道長辨绊,這世上最難降的妖魔是什么奶栖? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮门坷,結果婚禮上宣鄙,老公的妹妹穿的比我還像新娘。我一直安慰自己默蚌,他們只是感情好冻晤,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绸吸,像睡著了一般鼻弧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锦茁,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天攘轩,我揣著相機與錄音,去河邊找鬼码俩。 笑死度帮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的握玛。 我是一名探鬼主播够傍,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼甫菠,長吁一口氣:“原來是場噩夢啊……” “哼挠铲!你這毒婦竟也來了?” 一聲冷哼從身側響起寂诱,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拂苹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后痰洒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓢棒,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年丘喻,在試婚紗的時候發(fā)現(xiàn)自己被綠了脯宿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡泉粉,死狀恐怖连霉,靈堂內(nèi)的尸體忽然破棺而出榴芳,到底是詐尸還是另有隱情,我是刑警寧澤跺撼,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布窟感,位于F島的核電站,受9級特大地震影響歉井,放射性物質(zhì)發(fā)生泄漏柿祈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一哩至、第九天 我趴在偏房一處隱蔽的房頂上張望躏嚎。 院中可真熱鬧,春花似錦菩貌、人聲如沸紧索。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽珠漂。三九已至,卻和暖如春尾膊,著一層夾襖步出監(jiān)牢的瞬間媳危,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工冈敛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留待笑,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓抓谴,卻偏偏與公主長得像暮蹂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子癌压,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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