歸并排序(swift辜妓、oc雙語實(shí)現(xiàn))

基本思想

歸并排序(MERGE-SORT)是利用歸并的思想實(shí)現(xiàn)的排序方法苗沧,該算法采用經(jīng)典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然后遞歸求解愉舔,而治(conquer)的階段則將分的階段得到的各答案"修補(bǔ)"在一起,即分而治之)察郁。

分而治之
1024555-20161218163120151-452283750.png

 可以看到這種結(jié)構(gòu)很像一棵完全二叉樹衍慎,本文的歸并排序我們采用遞歸去實(shí)現(xiàn)(也可采用迭代的方式去實(shí)現(xiàn))。分階段可以理解為就是遞歸拆分子序列的過程绳锅,遞歸深度為log2n西饵。

合并相鄰有序子序列

再來看看治階段酝掩,我們需要將兩個(gè)已經(jīng)有序的子序列合并成一個(gè)有序序列鳞芙,比如上圖中的最后一次合并,要將[4,5,7,8]和[1,2,3,6]兩個(gè)已經(jīng)有序的子序列,合并為最終序列[1,2,3,4,5,6,7,8]原朝,來看下實(shí)現(xiàn)步驟驯嘱。


1024555-20161218194508761-468169540.png

代碼實(shí)現(xiàn)

OC:

- (void)mergeSort:(NSMutableArray *)arr{
    NSMutableArray *temp = [NSMutableArray arrayWithCapacity:arr.count];//在排序前,先建好一個(gè)長度等于原數(shù)組長度的臨時(shí)數(shù)組喳坠,避免遞歸中頻繁開辟空間
    [self sort:arr Left:0 Right:(int)arr.count-1 Temp:temp];
    
}

- (void)sort:(NSMutableArray *)arr Left:(int)left Right:(int)right Temp:(NSMutableArray *)temp{
    if(left<right){
        int mid = (left+right)/2;
       [self sort:arr Left:left Right:mid Temp:temp];//左邊歸并排序鞠评,使得左子序列有序
       [self sort:arr Left:mid+1 Right:right Temp:temp]; //右邊歸并排序,使得右子序列有序
        [self merge:arr Left:left Mid:mid Right:right Temp:temp];//將兩個(gè)有序子數(shù)組合并操作
    }
}

- (void)merge:(NSMutableArray *)arr Left:(int)left Mid:(int)mid Right:(int)right Temp:(NSMutableArray *)temp{
    int i = left;//左序列指針
    int j = mid+1;//右序列指針
    int t = 0;//臨時(shí)數(shù)組指針
    while (i<=mid && j<=right){
        if(arr[i]<=arr[j]){
            temp[t++] = arr[i++];
        }else {
            temp[t++] = arr[j++];
        }
    }
    while(i<=mid){//將左邊剩余元素填充進(jìn)temp中
        temp[t++] = arr[i++];
    }
    while(j<=right){//將右序列剩余元素填充進(jìn)temp中
        temp[t++] = arr[j++];
    }
    t = 0;
    //將temp中的元素全部拷貝到原數(shù)組中
    while(left <= right){
        arr[left++] = temp[t++];
    }
}

swift:

func mergeSort(arr:inout Array<Int>){
        var temp = [Int](repeating: 0, count: arr.count)
        self.sort(arr: &arr, left: 0, right:(arr.count-1), temp: &temp)
    }
    
    func sort(arr:inout [Int],left:Int,right:Int,temp:inout [Int]){
        if left<right {
           let mid:Int = (left + right)/2;
            sort(arr: &arr, left: left, right: mid, temp: &temp)
            sort(arr: &arr, left: mid+1, right: right, temp: &temp)
            merge(arr: &arr, left:left, mid: mid, right: right, temp: &temp)
            
        }
    }
    
    func merge(arr:inout [Int],left:Int,mid:Int,right:Int,temp:inout [Int]) {
        var i = left
        var j = mid + 1
        var t = 0
        
        while i<=mid && j<=right{
            if(arr[i]<=arr[j]){
                temp[t] = arr[i];
                t = t+1
                i = i+1
            }else {
                temp[t] = arr[j];
                t = t+1
                j = j+1
            }
        }
        
        while i<=mid {
            temp[t] = arr[i];
            t = t+1
            i = i+1
        }
        
        while j<=right {
            temp[t] = arr[j];
            t = t+1
            j = j+1
        }
        t = 0;
        var left = left
        while left <= right{
            arr[left]  = temp[t];
            left=left+1
            t=t+1
        }
    }

最后

歸并排序是穩(wěn)定排序壕鹉,它也是一種十分高效的排序剃幌,能利用完全二叉樹特性的排序一般性能都不會(huì)太差。從上文的圖中可看出晾浴,每次合并操作的平均時(shí)間復(fù)雜度為O(n)负乡,而完全二叉樹的深度為|log2n|〖够耍總的平均時(shí)間復(fù)雜度為O(nlogn)抖棘。而且,歸并排序的最好狸涌,最壞切省,平均時(shí)間復(fù)雜度均為O(nlogn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帕胆,一起剝皮案震驚了整個(gè)濱河市朝捆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惶楼,老刑警劉巖右蹦,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異歼捐,居然都是意外死亡何陆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門豹储,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贷盲,“玉大人,你說我怎么就攤上這事剥扣」剩” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵钠怯,是天一觀的道長佳魔。 經(jīng)常有香客問我,道長晦炊,這世上最難降的妖魔是什么鞠鲜? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任宁脊,我火速辦了婚禮,結(jié)果婚禮上贤姆,老公的妹妹穿的比我還像新娘榆苞。我一直安慰自己,他們只是感情好霞捡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布坐漏。 她就那樣靜靜地躺著,像睡著了一般碧信。 火紅的嫁衣襯著肌膚如雪赊琳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天砰碴,我揣著相機(jī)與錄音慨畸,去河邊找鬼。 笑死衣式,一個(gè)胖子當(dāng)著我的面吹牛寸士,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碴卧,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弱卡,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了住册?” 一聲冷哼從身側(cè)響起婶博,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荧飞,沒想到半個(gè)月后凡人,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叹阔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年挠轴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耳幢。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岸晦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出睛藻,到底是詐尸還是另有隱情启上,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布店印,位于F島的核電站冈在,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏按摘。R本人自食惡果不足惜包券,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一迫靖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兴使,春花似錦、人聲如沸照激。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俩垃。三九已至励幼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間口柳,已是汗流浹背苹粟。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跃闹,地道東北人嵌削。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像望艺,于是被迫代替她去往敵國和親苛秕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 今天我們來總結(jié)一下經(jīng)典常用的排序算法找默。 排序算法可以分為內(nèi)部排序和外部排序艇劫,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而...
    Tangmi_Up閱讀 1,444評(píng)論 1 15
  • 該系列文章主要是記錄下自己暑假這段時(shí)間的學(xué)習(xí)筆記惩激,暑期也在實(shí)習(xí)店煞,抽空學(xué)了很多,每個(gè)方面的知識(shí)我都會(huì)另起一篇博客去記...
    Yanci516閱讀 12,212評(píng)論 6 19
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,253評(píng)論 0 2
  • 前言 本篇文章基本是從常用排序算法總結(jié)(一)快速排序引申而來风钻,其中大部分代碼和描述都來自這兩篇文章顷蟀。 時(shí)間復(fù)雜度 ...
    王三的貓阿德閱讀 1,086評(píng)論 0 1
  • 紫欣又一次從夢(mèng)中醒來哮兰,這已經(jīng)是連續(xù)第三天的晚上夢(mèng)到他了毛萌。 夢(mèng)有點(diǎn)美好,因?yàn)橛兴戎汀km然她只見過他一次阁将,但是僅一次,她...
    林里葉落閱讀 462評(píng)論 2 4