49_歸并排序和快速排序

關(guān)鍵詞:歸并排序哗讥、快速排序

0. 歸并排序

思想:將兩個(gè)或兩個(gè)以上的有序序列合并成一個(gè)新的有序序列朵栖,這種并歸的方法稱為2路并歸责循。
將3個(gè)有序序列歸并成一個(gè)新的有序序列稱為3路歸并撮珠;
將N個(gè)有序序列歸并成一個(gè)新的有序序列稱為N路歸并歌粥;
將多個(gè)有序序列歸并成一個(gè)新的有序序列稱為多路歸并塌忽。

2路歸并示例

通過遞歸的方法將無(wú)序的序列分解為單個(gè)有序序列,然后調(diào)用歸并排序函數(shù)Merge(T scr[], T helper[], int begin, int mid, int end, bool min2max)失驶,實(shí)現(xiàn)并歸排序土居。

template < typename T >
    static void Merge(T scr[], T helper[], int begin, int mid, int end, bool min2max)
    {
        int i = begin;
        int j = mid + 1;
        int k = begin;

        while( (i<=mid) && (j<=end) )
        {
            if( min2max ? (scr[i] < scr[j]) : (scr[i] > scr[j]))
            {
                helper[k++] = scr[i++];
            }
            else
            {
                helper[k++] = scr[j++];
            }
        }

        while(i <= mid)
        {
            helper[k++] = scr[i++];
        }

        while(j <= end)
        {
            helper[k++] = scr[j++];
        }

        for(i=begin; i<=end; ++i)
        {
            scr[i] = helper[i];
        }
    }

    template < typename T >
    static void Merge(T scr[], T helper[], int begin, int end, bool min2max=true)
    {
        if( begin < end )
        {
            int mid = (begin + end) / 2;

            Merge(scr, helper, begin, mid, min2max);
            Merge(scr, helper, mid+1, end, min2max);
            Merge(scr, helper, begin, mid, end, min2max);
        }
    }

template < typename T >
    static void Merge(T array[], int len, bool min2max = true)
    {
        T* helper = new T[len];

        if( helper != NULL )
        {
            Merge(array, helper, 0, len-1, min2max);
        }

        delete[] helper;
    }

1. 快速排序

思想:任取序列中某個(gè)數(shù)據(jù)元素作為基準(zhǔn)將整個(gè)序列劃分為左右兩個(gè)子序列,在左側(cè)子序列中所有元素都小于或等于基準(zhǔn)元素在右側(cè)子序列中所有元素都大于基準(zhǔn)元素装盯,基準(zhǔn)元素排在這兩個(gè)子序列中間坷虑。分別對(duì)這兩個(gè)子序列重復(fù)進(jìn)行劃分,直到所有的數(shù)據(jù)元素都排在相應(yīng)位置為止埂奈。

快排原理示意圖

示例

    template < typename T >
    static int partition(T array[], int begin, int end, bool min2max)
    {
        T pv = array[begin];

        while( begin < end )
        {
            while( (begin < end) && (min2max ? (array[end] > pv) : (array[end] < pv)) )
            {
                --end;
            }

            if( begin != end )
            {
                Swap(array[begin], array[end]);
            }

            while( (begin < end) && (min2max ? (array[begin] <= pv) : (array[begin] >= pv)) )
            {
                ++begin;
            }

            if( begin != end )
            {
                Swap(array[begin], array[end]);
            }
        }

        array[begin] = pv;

        return begin;
    }

    template < typename T >
    static void Quick(T array[], int begin, int end, bool min2max)
    {
        if( begin < end )
        {
            int pivot = partition(array, begin, end, min2max);

            Quick(array, begin, pivot-1, min2max);
            Quick(array, pivot+1, end, min2max);
        }
    }

template < typename T >
    static void Quick(T array[], int len, bool min2max = true)
    {
        Quick(array, 0, len-1, min2max);
    }

2. 小結(jié)

  • 歸并排序需要額外的輔助空間才能完成迄损,空間復(fù)雜度為O(n)
  • 歸并排序的時(shí)間復(fù)雜度為O(nlogn),是一種穩(wěn)定的排序法
  • 快速排序通過遞歸的方式對(duì)排序問題進(jìn)行劃分
  • 快速排序的時(shí)間復(fù)雜度為O(nlogn)账磺,是一種不穩(wěn)定的排序法

聲明:此文章僅是本人在學(xué)習(xí)狄泰學(xué)院《數(shù)據(jù)結(jié)構(gòu)實(shí)戰(zhàn)開發(fā)教程》所做的筆記芹敌,文章中包含狄泰軟件資料內(nèi)容,一切版權(quán)歸狄泰軟件所有垮抗!
實(shí)驗(yàn)環(huán)境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氏捞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冒版,更是在濱河造成了極大的恐慌液茎,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辞嗡,死亡現(xiàn)場(chǎng)離奇詭異捆等,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)续室,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門栋烤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人挺狰,你說(shuō)我怎么就攤上這事明郭。” “怎么了丰泊?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵薯定,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我趁耗,道長(zhǎng)沉唠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任苛败,我火速辦了婚禮满葛,結(jié)果婚禮上作彤,老公的妹妹穿的比我還像新娘部念。我一直安慰自己个唧,他們只是感情好突那,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布隘膘。 她就那樣靜靜地躺著英染,像睡著了一般轨功。 火紅的嫁衣襯著肌膚如雪牢酵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天谊却,我揣著相機(jī)與錄音柔昼,去河邊找鬼。 笑死炎辨,一個(gè)胖子當(dāng)著我的面吹牛捕透,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碴萧,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼乙嘀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了破喻?” 一聲冷哼從身側(cè)響起虎谢,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎曹质,沒想到半個(gè)月后婴噩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羽德,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年讳推,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玩般。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖礼饱,靈堂內(nèi)的尸體忽然破棺而出坏为,到底是詐尸還是另有隱情,我是刑警寧澤镊绪,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布匀伏,位于F島的核電站,受9級(jí)特大地震影響蝴韭,放射性物質(zhì)發(fā)生泄漏够颠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一榄鉴、第九天 我趴在偏房一處隱蔽的房頂上張望履磨。 院中可真熱鬧,春花似錦庆尘、人聲如沸剃诅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)矛辕。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間聊品,已是汗流浹背飞蹂。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翻屈,地道東北人陈哑。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像妖胀,于是被迫代替她去往敵國(guó)和親芥颈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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

  • 一赚抡、 單項(xiàng)選擇題(共71題) 對(duì)n個(gè)元素的序列進(jìn)行冒泡排序時(shí)爬坑,最少的比較次數(shù)是( )。A. n ...
    貝影閱讀 9,093評(píng)論 0 10
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,262評(píng)論 0 2
  • 概述 因?yàn)榻⊥砍迹由蠈?duì)各種排序算法理解不深刻盾计,過段時(shí)間面對(duì)排序就蒙了。所以決定對(duì)我們常見的這幾種排序算法進(jìn)行統(tǒng)一總...
    清風(fēng)之心閱讀 706評(píng)論 0 1
  • 概述排序有內(nèi)部排序和外部排序赁遗,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序署辉,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,278評(píng)論 0 35
  • 白天是搞笑廢物岩四,晚上是抑郁怪物
    為了那個(gè)她閱讀 203評(píng)論 0 0