iOS算法總結(jié)

總結(jié)了下在iOS開發(fā)常用到的算法,不管是在面試中還是日常開發(fā)中厚脉,都會(huì)用到

1央拖、冒泡排序
冒泡算法是重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素垮卓,如果他們的順序錯(cuò)誤就把他們交換過來垫桂。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成粟按。

對(duì)以下一組數(shù)據(jù)進(jìn)行降序排序(冒泡排序)“55, 23, 93, 23, 4, 56, 1, 34, 11, 69”

        int array[10] = {55, 23, 93, 23, 4, 56, 1, 34, 11, 69};
        
        int num = sizeof(array)/sizeof(int);
        
        for (int i = 0 ; i < num - 1; i++) {
          
            for (int j = 0 ; j < num - 1 - i; j++) {
               
                if (array[j] < array[j +1]) {
                    
                    int temp = array[j];
                    
                    array[j] = array[j+1];
                    
                    array[j+1] = temp;
                }
                
            }
        }
        
        for (int i = 0; i < num; i++) {
           
            printf("%d", array[i]);
            
            if (i == num - 1) {
                
                printf("\n");
                
            } else {
                
                printf(" ");
            }
        }

2诬滩、選擇排序
選擇排序的工作原理是每一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個(gè)元素灭将,存放在序列的起始位置疼鸟,直到全部待排序的數(shù)據(jù)元素排完。

對(duì)以下一組數(shù)據(jù)進(jìn)行升序排序(選擇排序)庙曙】站担“55, 23, 93, 23, 4, 56, 1, 34, 11, 69”

          int array[10] = {55, 23, 93, 23, 4, 56, 1, 34, 11, 69};
        
                int num = sizeof(array)/sizeof(int);
        
        for (int i = 0; i < num - 1; i++) {
            
            for (int j = i + 1; j < num ; j++) {
                
                if (array[i] > array [j]) {
                    
                    int temp = array[i];
                    
                    array[i] = array[j];
                    
                    array[j] = temp;
                }
                
            }
        }
        
                for (int i = 0; i < num; i++) {
        
                    printf("%d", array[i]);
        
                    if (i == num - 1) {
        
                        printf("\n");
        
                    } else {
        
                        printf(" ");
                    }
                }

3、快速排序算法
該方法的基本思想是:
1.先從數(shù)列中取出一個(gè)數(shù)作為基準(zhǔn)數(shù)。
2.分區(qū)過程吴攒,將比這個(gè)數(shù)大的數(shù)全放到它的右邊张抄,小于或等于它的數(shù)全放到它的左邊。
3.再對(duì)左右區(qū)間重復(fù)第二步舶斧,直到各區(qū)間只有一個(gè)數(shù)欣鳖。

- (void)viewDidLoad {
    [super viewDidLoad];

    NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@(55), @(23),@(93),@(23),@(4),@(56),@(1),@(34),@(69),nil];
    
    [self quickSortArray:arr withLeftIndex:0 andRightIndex:arr.count - 1];
    
    NSLog(@"%@",arr);
}


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

4怀酷、 歸并排序
該方法的基本思想是:
1.分解:將待排序的問題分解成大小大致相等的兩部分。
2.求解子問題:用歸并排序的方法對(duì)兩個(gè)子問題進(jìn)行遞歸排序嗜闻。
3.合并(merge):將排好序的有序子序列進(jìn)行合并蜕依,得到符合要求的子序列。

@interface ViewController ()

@property (nonatomic, strong) NSMutableArray *tempArr;

@end

@implementation ViewController

-(NSMutableArray *)tempArr
{
    if (_tempArr == nil) {
        _tempArr = [NSMutableArray array];
    }
    return _tempArr;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@(55), @(29),@(93),@(23),@(4),@(56),@(1),@(34),@(69),nil];
    [self mergeSortArray:arr lowIndex:0 highIndex:arr.count - 1];
    
    NSLog(@"%@",arr);
    
}


- (void)mergeSortArray:(NSMutableArray *)array lowIndex:(NSInteger)lowIndex highIndex:(NSInteger)highIndex
{
    if (lowIndex >= highIndex) {
        return;
    }
    NSInteger midIndex = lowIndex + (highIndex - lowIndex) / 2;
    [self mergeSortArray:array lowIndex:lowIndex highIndex:midIndex];
    [self mergeSortArray:array lowIndex:midIndex + 1 highIndex:highIndex];
    [self mergeArray:array lowIndex:lowIndex midIndex:midIndex highIndex:highIndex];
}

- (void)mergeArray:(NSMutableArray *)array lowIndex:(NSInteger)lowIndex midIndex:(NSInteger)midIndex highIndex:(NSInteger)highIndex
{
    for (NSInteger i = lowIndex; i <= highIndex; i ++) {
        self.tempArr[i] = array[i];
    }
    
    NSInteger k = lowIndex;
    NSInteger l = midIndex + 1;
    for (NSInteger j = lowIndex; j <= highIndex; j ++) {
        if (l > highIndex) {
            array[j] = self.tempArr[k];
            k++;
        }else if (k > midIndex)
        {
            array[j] = self.tempArr[l];
            l++;
        }else if ([self.tempArr[k] integerValue] > [self.tempArr[l] integerValue])
        {
            array[j] = self.tempArr[l];
            l++;
        }else
        {
            array[j] = self.tempArr[k];
            k++;
        }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琉雳,一起剝皮案震驚了整個(gè)濱河市样眠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翠肘,老刑警劉巖檐束,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異束倍,居然都是意外死亡被丧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門绪妹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甥桂,“玉大人,你說我怎么就攤上這事邮旷』蒲。” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵婶肩,是天一觀的道長办陷。 經(jīng)常有香客問我,道長狡孔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任蜂嗽,我火速辦了婚禮苗膝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘植旧。我一直安慰自己辱揭,他們只是感情好离唐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著问窃,像睡著了一般亥鬓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上域庇,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天嵌戈,我揣著相機(jī)與錄音,去河邊找鬼听皿。 笑死熟呛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尉姨。 我是一名探鬼主播庵朝,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼又厉!你這毒婦竟也來了九府?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤覆致,失蹤者是張志新(化名)和其女友劉穎侄旬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篷朵,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勾怒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了声旺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笔链。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖腮猖,靈堂內(nèi)的尸體忽然破棺而出鉴扫,到底是詐尸還是另有隱情,我是刑警寧澤澈缺,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布坪创,位于F島的核電站,受9級(jí)特大地震影響姐赡,放射性物質(zhì)發(fā)生泄漏莱预。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一项滑、第九天 我趴在偏房一處隱蔽的房頂上張望依沮。 院中可真熱鬧,春花似錦、人聲如沸危喉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辜限。三九已至皇拣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間薄嫡,已是汗流浹背氧急。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岂座,地道東北人态蒂。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像费什,于是被迫代替她去往敵國和親钾恢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 算法總結(jié) 排序算法說明 (1)排序的定義:對(duì)一序列對(duì)象根據(jù)某個(gè)關(guān)鍵字進(jìn)行排序鸳址; 輸入:n個(gè)數(shù):a1,a2,a3,....
    AKyS佐毅閱讀 634評(píng)論 0 5
  • 希爾排序(Shell Sort):是插入排序算法的一種更高效的改進(jìn)版本瘩蚪。在這之前冒泡、選擇稿黍、插入排序的時(shí)間復(fù)雜度基...
    方圓一里閱讀 3,047評(píng)論 2 19
  • “堆”排序 疊羅漢大家都知道吧疹瘦,就是把人堆在一起,而這里我們要介紹的“堆”結(jié)構(gòu)相當(dāng)于把數(shù)字堆成一個(gè)塔型的結(jié)構(gòu)巡球。如圖...
    方圓一里閱讀 5,142評(píng)論 9 15
  • 長大了,學(xué)會(huì)沉默了…… 長大了矿筝,變得現(xiàn)實(shí)了…… 長大了起便,不敢說自己的夢(mèng)想了…… 其實(shí),你有好多好多的話會(huì)想要說窖维。 ...
    布衣阿靖閱讀 285評(píng)論 1 1
  • 對(duì)老公溫柔榆综,體貼,他的價(jià)值
    freshriver閱讀 188評(píng)論 0 0