iOS 常用的簡單算法

冒泡排序

概念

冒泡排序是一種簡單的排序算法畏梆。它重復地走訪過要排序的數(shù)列芍碧,一次比較兩個元素痕惋,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復地進行直到?jīng)]有再需要交換皆怕,也就是說該數(shù)列已經(jīng)排序完成毅舆。這個算法的名字由來是因為越小的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端西篓。

算法分析

比較相鄰的元素。如果第一個比第二個大憋活,就交換他們兩個岂津。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對悦即。在這一點吮成,最后的元素應該會是最大的數(shù)。針對所有的元素重復以上的步驟辜梳,除了最后一個粱甫。持續(xù)每次對越來越少的元素重復上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較作瞄。

代碼

-(void)maopao:(NSMutableArray *)arr{
    for (int i = 0; i < arr.count; i++){
        for (int j = 0; j < arr.count - 1 - i; j++) {
            if (arr[j] > arr[j+1]) {
                [arr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
            } 
        }
    }
}

快排

概念

快速排序(Quicksort)是對冒泡排序的一種改進茶宵。它的基本思想是:通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小粉洼,然后再按此方法對這兩部分數(shù)據(jù)分別進行快速排序节预,整個排序過程可以遞歸進行,以此達到整個數(shù)據(jù)變成有序序列属韧。在平均狀況下安拟,排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較宵喂,但這種狀況并不常見糠赦。快速排序使用分治法(Divide and conquer)策略來把一個串行(list)分為兩個子串行(sub-lists)锅棕。

算法步驟

從數(shù)列中挑出一個元素拙泽,稱為 “基準”(pivot),重新排序數(shù)列裸燎,所有元素比基準值小的擺放在基準前面顾瞻,所有元素比基準值大的擺在基準的后面(相同的數(shù)可以到任一邊)。在這個分區(qū)退出之后德绿,該基準就處于數(shù)列的中間位置荷荤。這個稱為分區(qū)(partition)操作。遞歸地(recursive)把小于基準值元素的子數(shù)列和大于基準值元素的子數(shù)列排序移稳。遞歸的最底部情形蕴纳,是數(shù)列的大小是零或一,也就是永遠都已經(jīng)被排序好了个粱。雖然一直遞歸下去古毛,但是這個算法總會退出,因為在每次的迭代(iteration)中都许,它至少會把一個元素擺到它最后的位置去稻薇。

代碼(遞歸實現(xiàn))

-(void)quickSortWithArray:(NSMutableArray *)array withLeft:(NSInteger)left andRight:(NSInteger)right{
    if (left >= right) return;
    
    NSInteger i = left;
    NSInteger j = right;
    NSInteger key = [array[left] integerValue];
    
    while (i < j) {
        while (i < j && key <= [array[j] integerValue]) {
            j--;
        }
        array[i] = array[j];
        while (i < j && key >= [array[i] integerValue]) {
            i++;
        }
        array[j] = array[i];
    }
    array[i] = [NSNumber numberWithInteger:key];
    
    [self quickSortWithArray:array withLeft:left andRight:i - 1];
    [self quickSortWithArray:array withLeft:i + 1 andRight:right];
}

二分查找

定義中間值和所查找值進行比較嫂冻,小于中間值就查找中間值左邊的值,大于則相反颖低。所以絮吵,二分查找要滿足被查的數(shù)組是有序排列的弧烤。

代碼

非遞歸寫法

- (NSInteger)binarySearchNoRecursion:(NSArray *)srcArray withDes:(NSNumber *)des{
    NSInteger low = 0;
    NSInteger high = [srcArray count] - 1;
    while (low <= high) {
        NSInteger middle = low + ((high - low)>>1);//中間位置計算,low+ 最高位置減去最低位置,右移一位,相當于除2.也可以用(high+low)/2
        if ([des integerValue] == [srcArray[middle] integerValue]) return middle;
        else if([des integerValue] < [srcArray[middle] integerValue])  high = middle - 1;
        else low = middle + 1;
    }
    return -1;//沒有找到
}

遞歸寫法

- (NSUInteger)binarySearchWithRecursion:(NSArray *)array withDes:(NSNumber *)target start:(NSUInteger)start end:(NSUInteger)end {
    if (start > end) {
        return -1;//沒有找到
    }
    NSUInteger mid = start + (end - start) / 2;
    if (target > array[mid]) {
        return [self binarySearchWithRecursion:array withDes:target start:mid+1 end:end];
    }else if (target < array[mid]) {
        return [self binarySearchWithRecursion:array withDes:target start:start end:mid-1];
    }else {
        return mid;
    }
}

更多算法參考:吳白

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忱屑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子暇昂,更是在濱河造成了極大的恐慌莺戒,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件急波,死亡現(xiàn)場離奇詭異从铲,居然都是意外死亡,警方通過查閱死者的電腦和手機澄暮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門名段,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泣懊,你說我怎么就攤上這事伸辟。” “怎么了馍刮?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵信夫,是天一觀的道長。 經(jīng)常有香客問我卡啰,道長静稻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任匈辱,我火速辦了婚禮振湾,結果婚禮上,老公的妹妹穿的比我還像新娘亡脸。我一直安慰自己押搪,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布梗掰。 她就那樣靜靜地躺著嵌言,像睡著了一般。 火紅的嫁衣襯著肌膚如雪及穗。 梳的紋絲不亂的頭發(fā)上摧茴,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音埂陆,去河邊找鬼苛白。 笑死娃豹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的购裙。 我是一名探鬼主播懂版,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼躏率!你這毒婦竟也來了躯畴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤薇芝,失蹤者是張志新(化名)和其女友劉穎蓬抄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夯到,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嚷缭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了耍贾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阅爽。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荐开,靈堂內(nèi)的尸體忽然破棺而出付翁,到底是詐尸還是另有隱情,我是刑警寧澤誓焦,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布胆敞,位于F島的核電站,受9級特大地震影響杂伟,放射性物質(zhì)發(fā)生泄漏移层。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一赫粥、第九天 我趴在偏房一處隱蔽的房頂上張望观话。 院中可真熱鬧,春花似錦越平、人聲如沸频蛔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晦溪。三九已至,卻和暖如春挣跋,著一層夾襖步出監(jiān)牢的瞬間三圆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舟肉,地道東北人修噪。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像路媚,于是被迫代替她去往敵國和親黄琼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

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

  • <希爾排序> 詳細代碼請參考Algorithm整慎。參考代碼比文字好理解脏款。希爾排序,也稱遞減增量排序算法院领,是插入排序的...
    明明的魔樣閱讀 1,724評論 0 1
  • 我一直覺得寫代碼也可以寫出藝術弛矛,在不懂畫的人的眼里够吩,《向日葵》不過是小孩子的涂鴉比然,在懂代碼的人眼里,那看似混亂的字...
    AidenRao閱讀 4,149評論 9 59
  • Ba la la la ~ 讀者朋友們周循,你們好啊强法,又到了冷鋒時間,話不多說湾笛,發(fā)車饮怯! 1.冒泡排序(Bub...
    王飽飽閱讀 1,790評論 0 7
  • 那天 我站在門口 靜靜地聽著 樓梯里熟悉的腳步聲 越來越遠…… 那天 我佇立窗前 看著窗外雨打芭蕉 涼風習習 搖曳...
    文采樂閱讀 196評論 2 2
  • 國慶長假后天如期而至。節(jié)日前熱鬧的氣氛隨著街道兩邊的紅彤彤的花臺造型嚎研,上面寫著:“熱愛祖國”的紅色主題詞蓖墅,漸入節(jié)日...
    潤澤之天閱讀 161評論 0 0