基本的一些熟知的算法总结:oc版

每次面试,想必大家都会多多少少的遇到些算法题。忙里偷闲整理了几个基本的算法,就当是复习了,希望给需要的人作为参考!

以下这几道算法,都是用oc语言写的,大学那会学算法,是c++语言写的,后来查资料也都是类似的C语言写的,如今把她翻译成了OC语言。

1.桶排序(原理自己查资料)

[self algorithms];//桶排序 o(m+n)

- (void)algorithms{

    NSArray *arr = @[@"5",@"3",@"5",@"2",@"8"];

    for(NSString*a  in arr) {

            intb = [aintValue];

            intc = [self.array[b]intValue];

            self.array[b] = [NSStringstringWithFormat:@"%d",c+1];

    }

//   for (int j=0;j<self.array.count; j++){//从小到大

        for(intj=10;j>0; j--){//从大到小

            int c = [self.array[j] intValue];

        if(c!=0){

           for(intk =0; k<c; k++){

                 NSLog(@"%@%d",@"桶排序",j);

            }

        }

    }

}

- (NSMutableArray *)array{

    if(!_array){

        _array= [[NSMutableArrayalloc]init];

        for(inti=0; i<11; i++) {

            _array[i]=@"0";

        }

    }

    return _array;

}

2.冒泡排序

 [self bubble];//冒泡排序 o(n*n)

- (void)bubble{//最后我们总结一下:如果有 n 个数进行排序,只需将 n-1 个数归位,也就是说要进行 n-1 趟操作

    NSArray *arr = @[@{@"q":@"5"},@{@"w":@"3"},@{@"e":@"5"},@{@"r":@"2"},@{@"t":@"8"}];

    NSMutableArray *mulArr= [[NSMutableArray alloc] initWithArray:arr];

    for(int k=0; k<arr.count-1; k++){

        for(inti=0; i<mulArr.count-k-1; i++){

            NSArray*arr = [mulArr[i]allKeys];

            NSString*value = [mulArr[i]valueForKey:arr[0]];

            int a = [value intValue];

            NSArray*arr1 = [mulArr[i+1]allKeys];

            NSString*value1 = [mulArr[i+1]valueForKey:arr1[0]];

            int   b = [value1  intValue];

            if(a<b){

                NSDictionary*dic = mulArr[i] ;

                mulArr[i] = mulArr[i+1];

                mulArr[i+1] = dic;

            }

        }

    }

    NSLog(@"%@%@",@"冒泡排序",mulArr);

}

3.快排

NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@(6), @(1),@(2),@(7),@(9),@(3),@(4),@(5),@(10),@(8),nil];

    [self quicksortWithleft:0 WithRight:9 WithArr:arr];

    NSLog(@"%@",arr);

- (void)quicksortWithleft:(int)left WithRight:(int)right WithArr:(NSMutableArray*)a{

    if(left>=right){

        return;

    }


   int temp=[a[left]intValue];//temp中存的就是基准数

   inti=left;

   intj=right;

    while(i!=j)

    {

        //顺序很重要,要先从右往左找

        while([a[j]intValue]>=temp && i<j){

            j--;

        }



         //再从左往右找

        while([a[i]intValue]<=temp && I<j){

            i++;

        }

        //交换两个数在数组中的位置 ,当哨兵i和哨兵j没有相遇时

        if(I<j){

            NSNumber*t=a[i];

            a[i]=a[j];

            a[j]=t;

        }

    }

    //最终将基准数归位

    a[left]=a[i];

    a[i]=[NSNumber numberWithInt:temp];

    [self quicksortWithleft:left WithRight:i-1 WithArr:a];//继续处理左边的,这里是一个递归的过程

    [self quicksortWithleft:i+1 WithRight:right WithArr:a];//继续处理右边的,这里是一个递归的过程

}

4.直接插入排序

//直接插入排序 o(n*n)

NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@(6), @(1),@(2),@(7),@(9),@(3),@(4),@(5),@(10),@(8),nil];

    [self insertSortWithArr:arr];

//当数据正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N);当数据反序时,执行效率最差,每次插入都要前面的元素后移,时间复杂度为O(N2)。所以,数据越接近正序,直接插入排序的算法性能越好。

- (void)insertSortWithArr:(NSMutableArray*)arr{

    for(inti=1; i<arr.count; i++){

        int temp = [arr[i] intValue];

        int j;

        for(j=i-1; j>=0&&[arr[j] intValue]>temp  ;j--) {

            arr[j+1] = arr[j];

        }

        arr[j+1] = [NSNumber numberWithInt:temp];

    }

     NSLog(@"%@",arr);

}

5.选择排序

//选择排序 o(n*n)

NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@(6), @(1),@(2),@(7),@(9),@(3),@(4),@(5),@(10),@(8),nil];

    [self selectionWithArr:arr];

//选择排序的思想:选择排序算法的基本思想是对a[1]...a[r]进行r-1遍处理,第i遍处理 是将a[i],⋯,a[r]中最小者d的位置找到,然后与a[i]交换位置。这样,经过r-1遍处理之后,较小的r-1个元素的位置已经是正确的了

- (void)selectionWithArr:(NSMutableArray*)arr{

    for(inti =0;i<arr.count-1; i++){

        //找出最小数的下标

        intmin = i;

        for(intj=i+1; j<arr.count; j++){ 

            if([arr[j] intValue]<[arr[min] intValue]) {

                min = j;

            }

        }

        //交换位置

        NSNumber*t=arr[min];

        arr[min]=arr[i];

        arr[i]=t;

    }

    NSLog(@"%@",arr);

}


以上有些算法没有表明原理,请自己查询。建议在对这些算法原理基本弄明白以后再去参考此代码,可以更加容易看懂!(上面的代码都是可以运行的,并且运行结果正确,如果你们有更简洁的写法可以提出来,如果有其他语言的版本,欢迎贴出来大家共享)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容

  • iOS中常用的排序方法有(冒泡、选择、快速、插入、希尔、归并、基数) 接下来就依次介绍一下,直接上代码 1、冒泡排...
    Leeson1989阅读 1,015评论 0 0
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    开心的锣鼓阅读 3,320评论 0 9
  • 01-常量与变量 学习swift第一步打印Hello World print("Hello World") swi...
    iOS_恒仔阅读 5,149评论 2 19
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一...
    阿里高级软件架构师阅读 3,286评论 0 19
  • 小A已经疯了。 我妈跟我说的时候,我愣了会儿:中午还是……疯了啊。 ……………… 小A是一个特别克制的孩子。我妈总...
    有心相思阅读 200评论 0 0