iOS排序算法

(插入排序氮唯、選擇排序、交換排序姨伟、歸并排序惩琉、基數(shù)排序)

排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序夺荒,而外部排序是因排序的數(shù)據(jù)很大瞒渠,一次不能容納全部的排序記錄,在排序過程中需要訪問外存技扼。
我們這里說說八大排序就是內(nèi)部排序伍玖。


1342514529_5795.jpg

自己用iOS寫了幾個(gè)排序,先來個(gè)數(shù)組:

    NSMutableArray *array = [NSMutableArray arrayWithObjects:@89,@2,@22,@95,@88,@66,@43,@31,@57, nil];

1剿吻、直接插入排序
思路:將一個(gè)記錄插入到已排序好的有序表中窍箍,從而得到一個(gè)新,記錄數(shù)增1的有序表丽旅。即:先將序列的第1個(gè)記錄看成是一個(gè)有序的子序列椰棘,然后從第2個(gè)記錄逐個(gè)進(jìn)行插入,直至整個(gè)序列有序?yàn)橹埂?br> 圖示:


1342520948_8667.jpg

代碼:

-(void)sortingForInsertWithArray:(NSMutableArray *)array{
   for (int i = 1; i<=array.count-1; i++) {
           int j = i-1;
           id temp = array[i];
           while (j>=0 && temp<array[j]) {
               array[j+1] = array[j];
               j--;
           }
           array[j+1] = temp;
   }
}

2榄笙、希爾排序
思路:希爾排序是1959 年由D.L.Shell 提出來的邪狞,相對(duì)直接排序有較大的改進(jìn)。希爾排序又叫縮小增量排序茅撞。
先將整個(gè)待排序的記錄序列分割成為若干子序列分別進(jìn)行直接插入排序帆卓,待整個(gè)序列中的記錄“基本有序”時(shí),再對(duì)全體記錄進(jìn)行依次直接插入排序米丘。

圖示:


1342577299_5077.jpg

代碼:

-(void)sortingForShellWithArray:(NSMutableArray *)array{
    int dk = (int)(array.count-1)/2;
    while (dk>=1) {
        [self shellSortingWithArray:array startIndex:dk];
        dk = dk/2;
    }
}
-(void)shellSortingWithArray:(NSMutableArray *)array startIndex:(int)dk{
    for (int i = dk; i<=array.count-1; i+=dk) {
        if (array[i]<array[i-dk]) {
            int j = i-dk;
            id temp = array[i];
            array[i] = array[i - dk];
            while (j>=0&&temp<array[j]) {
                array[j+dk] = array[j];
                j-=dk;
            }
            array[j+dk] = temp;
        }
    }
}

3鳞疲、簡(jiǎn)單選擇排序
思路:在要排序的一組數(shù)中,選出最腥溲痢(或者最大)的一個(gè)數(shù)與第1個(gè)位置的數(shù)交換尚洽;然后在剩下的數(shù)當(dāng)中再找最小(或者最大)的與第2個(gè)位置的數(shù)交換靶累,依次類推腺毫,直到第n-1個(gè)元素(倒數(shù)第二個(gè)數(shù))和第n個(gè)元素(最后一個(gè)數(shù))比較為止。
圖示:


1342586432_7130.jpg

代碼:

-(void)sortingForSelectWithArray:(NSMutableArray *)array{
    int i,j,k;
    for (i = 0; i<=array.count-1; i++) {
        k = i;
        for (j = i+1; j<=array.count-1; j++) {
            if (array[k] >array[j] ) {
                k = j;
            }
        }
        if (k!=i) {
            id temp = array[i];
            array[i]= array[k];
            array[k]= temp;
        }
    }
}

4挣柬、堆排序
思路:堆排序是一種樹形選擇排序潮酒,是對(duì)直接選擇排序的有效改進(jìn)。
堆的定義如下:具有n個(gè)元素的序列(k1,k2,...,kn),當(dāng)且僅當(dāng)滿足

時(shí)稱之為堆邪蛔。由堆的定義可以看出急黎,堆頂元素(即第一個(gè)元素)必為最小項(xiàng)(小頂堆)。若以一維數(shù)組存儲(chǔ)一個(gè)堆,則堆對(duì)應(yīng)一棵完全二叉樹勃教,且所有非葉結(jié)點(diǎn)的值均不大于(或不小于)其子女的值淤击,根結(jié)點(diǎn)(堆頂元素)的值是最小(或最大)的。如:
(a)大頂堆序列:(96, 83,27,38,11,09)
(b) 小頂堆序列:(12故源,36污抬,24,85绳军,47印机,30,53门驾,91)

初始時(shí)把要排序的n個(gè)數(shù)的序列看作是一棵順序存儲(chǔ)的二叉樹(一維數(shù)組存儲(chǔ)二叉樹)射赛,調(diào)整它們的存儲(chǔ)序,使之成為一個(gè)堆奶是,將堆頂元素輸出楣责,得到n 個(gè)元素中最小(或最大)的元素,這時(shí)堆的根節(jié)點(diǎn)的數(shù)最薪胗纭(或者最大)腐魂。然后對(duì)前面(n-1)個(gè)元素重新調(diào)整使之成為堆帐偎,輸出堆頂元素逐纬,得到n 個(gè)元素中次小(或次大)的元素。依此類推削樊,直到只有兩個(gè)節(jié)點(diǎn)的堆豁生,并對(duì)它們作交換,最后得到有n個(gè)節(jié)點(diǎn)的有序序列漫贞。稱這個(gè)過程為堆排序甸箱。
代碼:

-(void)sortingForHeapWithArray:(NSMutableArray *)array{
    for (int i = (int)(array.count -1)/2; i>=0; --i) {
        [self heapSortingWithArray:array startIndex:i arrayifCount:(int)array.count-1];
    }
    for (int i = (int)array.count-1; i>0; --i) {
        id temp = array[i];
        array[i] = array[0];
        array[0] = temp;
        [self heapSortingWithArray:array startIndex:0 arrayifCount:i];
    }
}
-(void)heapSortingWithArray:(NSMutableArray *)array startIndex:(int)startIndex arrayifCount:(int)count{
    id temp = array[startIndex];
    int child = 2*startIndex +1;
    while (child<count) {
        if (child+1<count &&array[child]<array[child+1]) {
            ++child;
        }
        if (array[startIndex]<array[child]) {
            array[startIndex] = array[child];
            startIndex = child;
            child = 2*startIndex+1;
        }else{
            break;
        }
        array[startIndex] = temp;
    }
}

5、冒泡排序
思路:在要排序的一組數(shù)中迅脐,對(duì)當(dāng)前還未排好序的范圍內(nèi)的全部數(shù)芍殖,自上而下對(duì)相鄰的兩個(gè)數(shù)依次進(jìn)行比較和調(diào)整,讓較大的數(shù)往下沉谴蔑,較小的往上冒豌骏。即:每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時(shí),就將它們互換隐锭。
圖示:


1342782078_9990.jpg

代碼:

-(void)sortingForBubblingWithArray:(NSMutableArray *)array{
    
    for (int i=0; i<=array.count-1; i++) {
        for (int j=0; j<array.count-1-i; j++) {
            if (array[j] < array[j+1] ) {
                id string = array[j];
                array[j]= array[j+1];
                array[j+1] = string;
            }
        }
    }
}

6窃躲、快速排序
思路:1)選擇一個(gè)基準(zhǔn)元素,通常選擇第一個(gè)元素或者最后一個(gè)元素,
2)通過一趟排序講待排序的記錄分割成獨(dú)立的兩部分,其中一部分記錄的元素值均比基準(zhǔn)元素值小钦睡。另一部分記錄的 元素值比基準(zhǔn)值大蒂窒。
3)此時(shí)基準(zhǔn)元素在其排好序后的正確位置
4)然后分別對(duì)這兩部分記錄用同樣的方法繼續(xù)進(jìn)行排序,直到整個(gè)序列有序。

圖示:
a)一趟排序:


1342782317_4426.jpg

b)排序全程:


1342782329_8314.jpg

代碼:

-(void)sortingForFastWithArray:(NSMutableArray *)array strartIndex:(int)strartIndex endIndex:(int)endIndex{
    
    if (strartIndex>endIndex) {
        return;
    }
    int i = strartIndex, j = endIndex;
    id  key = array[strartIndex];
    
    while (i<j) {
        
        while (i<j && key>=array[j]) {
            j--;
        }
        array[i] = array[j];
        
        while (i<j && key<=array[i]) {
            i++;
        }
        array[j] = array[i];
    }
    array[i] = key;
    [self sortingForFastWithArray:array strartIndex:strartIndex endIndex:i-1];
    [self sortingForFastWithArray:array strartIndex:i+1 endIndex:endIndex];
}

7洒琢、歸并排序
思路:歸并(Merge)排序法是將兩個(gè)(或兩個(gè)以上)有序表合并成一個(gè)新的有序表秧秉,即把待排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的纬凤。然后再把有序子序列合并為整體有序序列福贞。
圖示:


1342842633_6751.jpg

代碼:

-(void)sortingForMergeWithArray:(NSMutableArray *)array standbyArray:(NSMutableArray *)newArray startIndex:(int)startIndex endIndex:(int)endIndex{
    
    int middle;
    if (startIndex<endIndex) {
        
        middle = (startIndex +endIndex)/2;
        [self sortingForMergeWithArray:array standbyArray:newArray startIndex:startIndex endIndex:middle];
        [self sortingForMergeWithArray:array standbyArray:newArray startIndex:middle+1 endIndex:endIndex];
        
        int i = startIndex,
            j = middle+1,
            k = startIndex;
        
        while (i!=middle+1 && j!=endIndex +1) {
            if (array[i]>=array[j]) {
                newArray[k++] = array[j++];
            }else{
                newArray[k++] = array[i++];
            }
        }
        while (i!=middle+1) {
            newArray[k++] = array[i++];
        }
        while (j!=endIndex+1) {
            newArray[k++] = array[j++];
        }
        for (i = startIndex; i<=endIndex; i++) {
            array[i] = newArray[i];
        }
    }
}

參考文章:http://blog.csdn.net/hguisu/article/details/7776068

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市停士,隨后出現(xiàn)的幾起案子挖帘,更是在濱河造成了極大的恐慌,老刑警劉巖恋技,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拇舀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蜻底,警方通過查閱死者的電腦和手機(jī)骄崩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薄辅,“玉大人要拂,你說我怎么就攤上這事≌境” “怎么了脱惰?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)窿春。 經(jīng)常有香客問我拉一,道長(zhǎng),這世上最難降的妖魔是什么旧乞? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任蔚润,我火速辦了婚禮,結(jié)果婚禮上尺栖,老公的妹妹穿的比我還像新娘嫡纠。我一直安慰自己,他們只是感情好延赌,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布除盏。 她就那樣靜靜地躺著,像睡著了一般皮胡。 火紅的嫁衣襯著肌膚如雪痴颊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天屡贺,我揣著相機(jī)與錄音蠢棱,去河邊找鬼锌杀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛泻仙,可吹牛的內(nèi)容都是我干的糕再。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼玉转,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼突想!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起究抓,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤猾担,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后刺下,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绑嘹,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年橘茉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了工腋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畅卓,死狀恐怖擅腰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翁潘,我是刑警寧澤趁冈,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站唐础,受9級(jí)特大地震影響箱歧,放射性物質(zhì)發(fā)生泄漏矾飞。R本人自食惡果不足惜一膨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洒沦。 院中可真熱鬧豹绪,春花似錦、人聲如沸申眼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)括尸。三九已至巷蚪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間濒翻,已是汗流浹背屁柏。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工啦膜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淌喻。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓僧家,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親裸删。 傳聞我的和親對(duì)象是個(gè)殘疾皇子八拱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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

  • 最近在學(xué)習(xí)算法,對(duì)此也做一個(gè)總結(jié): 排序?qū)τ谌魏我粋€(gè)程序員來說每聪,可能都不會(huì)陌生旦棉。你學(xué)的第一個(gè)算法,可能就是排序药薯。大...
    被吹落的風(fēng)閱讀 3,171評(píng)論 0 28
  • 概述 排序有內(nèi)部排序和外部排序绑洛,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大童本,一次不能容納全部...
    zwb_jianshu閱讀 1,157評(píng)論 0 0
  • 概述 排序有內(nèi)部排序和外部排序真屯,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大穷娱,一次不能容納全部...
    閑云清煙閱讀 758評(píng)論 0 6
  • 轉(zhuǎn)載自CSDN規(guī)速 八大排序算法 概述 排序有內(nèi)部排序和外部排序绑蔫,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是...
    _小沫閱讀 545評(píng)論 0 1
  • 概述 排序有內(nèi)部排序和外部排序泵额,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序配深,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    printf200閱讀 773評(píng)論 0 0