簡單算法集

簡單排序法

這種方式是最笨拙的排序方式 效率最低:
每次排序只能確定一個位置臼氨,直到倒數(shù)第二次 末尾的最小值1才顯示到最后

- (void)logArray {
    NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
    for (int i = 0; i < arr.count; i++) {
        for (int j = i+1; j < arr.count; j++) {
            if (arr[i] < arr[j]) {
                [arr exchangeObjectAtIndex:i withObjectAtIndex:j];
            }
        }
        [self logArr:arr];
    }
}

一只锻、冒泡排序

比較相鄰兩個數(shù),如果后面的比前面的小 則交換位置权烧,然后再與后面的數(shù)比較

- (void)logArrayFunction {
    NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
    
    for (int i = 0; i < arr.count; i++) {
        for (int j = (int)arr.count-2; j >= i; j--) {
            if (arr[j] > arr[j+1]) {
                [arr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
            }
        }
    }
}

冒泡改良方式琴庵,避免初始就是排好的序列的方式 做過多的無用循環(huán)比較

- (void)logArrayFunctionNice {
    BOOL flag = YES;
    NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
    
    for (int i = 0; i < arr.count && flag; i++) {
        flag = NO;
        for (int j = (int)arr.count-2; j >= i; j--) {
            if (arr[j] > arr[j+1]) {
                [arr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
                flag = YES;
            }
        }
    }
}

二、插入排序法

拿后面一個數(shù)與前面的一個數(shù)做比較妒茬,如果滿足則交換担锤,然后再往前查找

- (void)logInsertionSortingArray {
    NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
    for (int i = 1; i < arr.count; i++) {
        int j = i;  /* j是一個坑, 確定坑的位置乍钻,再把數(shù)從坑里取出來肛循,注意順序*/
        id temp = arr[i];  /* temp 是從坑里取數(shù)*/
        if (arr[i] < arr[i-1]) {  /* j > 0 防止越界。寫&&前面效率更高*/
            temp = arr[i];
            while (j > 0 && [temp intValue] < [arr[j-1] intValue]) {
                arr[j] = arr[j-1];
                j--;
            }
            arr[j] = temp;
        }
    }
}

三团赁、選擇排序法

選擇一個數(shù),然后用這個數(shù)與后面的每一相比較直到遇到比它大的數(shù) 然后交換位置

- (void)logChooseArray {
    NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
    int min = 0, arrCount = (int)arr.count;
    for (int i = 0; i < arrCount-1; i++) {
        min = i;  
        for (int j = i + 1; j < arrCount; j++) {  
            if (arr[min] > arr[j]) {  /*如果有小于當前的最小值的關(guān)鍵字*/
                min = j;  /*將此關(guān)鍵字的下標賦值給min*/
            }
        }
        if (i != min) {  /*若min不等于i谨履,說明找到最小值欢摄,交換*/
            [arr exchangeObjectAtIndex:i withObjectAtIndex:min];
        }
    }
}
//每次循環(huán)打印結(jié)果如下
1 16 2 9 7 12 5 3 8 13 10
1 2 16 9 7 12 5 3 8 13 10
1 2 3 9 7 12 5 16 8 13 10
1 2 3 5 7 12 9 16 8 13 10
1 2 3 5 7 12 9 16 8 13 10
1 2 3 5 7 8 9 16 12 13 10
1 2 3 5 7 8 9 16 12 13 10
1 2 3 5 7 8 9 10 12 13 16
1 2 3 5 7 8 9 10 12 13 16
1 2 3 5 7 8 9 10 12 13 16
1 2 3 5 7 8 9 10 12 13 16

四、快速排序法

數(shù)組選第一個數(shù)笋粟,把比數(shù)小的放到數(shù)的左邊怀挠,比數(shù)大的放到右邊,結(jié)束后對左右兩邊的數(shù)組作重復處理即可害捕。

- (void)quickSortArray:(NSMutableArray *)array withLeftIndex:(NSInteger)leftIndex andRightIndex:(NSInteger)rightIndex
{
    if (leftIndex >= rightIndex) {//如果數(shù)組長度為0或1時返回
        return ;
    }
    
    NSInteger i = leftIndex;
    NSInteger j = rightIndex;
    //記錄比較基準數(shù)
    NSInteger key = [array[i] integerValue];
    
    while (i < j) {
        /**** 首先從右邊j開始查找比基準數(shù)小的值 ***/
        while (i < j && [array[j] integerValue] >= key) {//如果比基準數(shù)大绿淋,繼續(xù)查找
            j--;
        }
        //如果比基準數(shù)小,則將查找到的小值調(diào)換到i的位置
        array[i] = array[j];
        
        /**** 當在右邊查找到一個比基準數(shù)小的值時尝盼,就從i開始往后找比基準數(shù)大的值 ***/
        while (i < j && [array[i] integerValue] <= key) {//如果比基準數(shù)小吞滞,繼續(xù)查找
            i++;
        }
        //如果比基準數(shù)大,則將查找到的大值調(diào)換到j的位置
        array[j] = array[i];
        
    }
    
    //將基準數(shù)放到正確位置
    array[i] = @(key);
    
    /**** 遞歸排序 ***/
    //排序基準數(shù)左邊的
    [self quickSortArray:array withLeftIndex:leftIndex andRightIndex:i - 1];
    //排序基準數(shù)右邊的
    [self quickSortArray:array withLeftIndex:i + 1 andRightIndex:rightIndex];
}

    NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
    [self quickSortArray:arr withLeftIndex:0 andRightIndex:arr.count-1];

參考地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盾沫,一起剝皮案震驚了整個濱河市裁赠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赴精,老刑警劉巖佩捞,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蕾哟,居然都是意外死亡一忱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門谭确,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帘营,“玉大人,你說我怎么就攤上這事逐哈∫前桑” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵鞠眉,是天一觀的道長薯鼠。 經(jīng)常有香客問我择诈,道長,這世上最難降的妖魔是什么出皇? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任羞芍,我火速辦了婚禮,結(jié)果婚禮上郊艘,老公的妹妹穿的比我還像新娘荷科。我一直安慰自己,他們只是感情好纱注,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布畏浆。 她就那樣靜靜地躺著,像睡著了一般狞贱。 火紅的嫁衣襯著肌膚如雪刻获。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天瞎嬉,我揣著相機與錄音蝎毡,去河邊找鬼。 笑死氧枣,一個胖子當著我的面吹牛沐兵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播便监,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼扎谎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烧董?” 一聲冷哼從身側(cè)響起簿透,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎解藻,沒想到半個月后老充,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡螟左,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年啡浊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胶背。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡巷嚣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钳吟,到底是詐尸還是另有隱情廷粒,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站坝茎,受9級特大地震影響涤姊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗤放,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一思喊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧次酌,春花似錦恨课、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吊宋,卻和暖如春纲辽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贫母。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工文兑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盒刚,地道東北人腺劣。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像因块,于是被迫代替她去往敵國和親橘原。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

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

  • 概述:排序有內(nèi)部排序和外部排序涡上,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序趾断,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,729評論 0 15
  • 概述 排序有內(nèi)部排序和外部排序吩愧,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序芋酌,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,168評論 0 52
  • 概述排序有內(nèi)部排序和外部排序雁佳,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序脐帝,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,259評論 0 35
  • 新寫的舊歌糖权,是李宗盛寫給父親的新歌堵腹。 QQ音樂首發(fā)推薦詞這樣寫道: “這是一首新寫的舊歌,是一個埋藏在大哥心里多年...
    蒙蜀閱讀 486評論 0 0
  • 初到武漢星澳,首先感覺是大疚顷,坐地鐵從火車站出發(fā)一個多小時才到目的地。其次感覺武漢三鎮(zhèn)區(qū)別大了,武昌是老鎮(zhèn)腿堤,房子老阀坏。漢陽...
    華在天涯閱讀 99評論 0 0