一个 iOS简单的冒泡算法

自己来实现一个简单的冒泡算法,除了可以用系统的sortedArrayUsingComparator排序方法之外,可以自己动手来实现一个。

做程序,随着经验的增长,编程习惯,目录结构,编程风格,程序架构采用什么设计模式,考虑代码对性能的影响都会反应这个人的实力,在见多识广的大牛面前(我也是个菜鸟),一眼就能看出来这个人是处在什么水平。能做的就是不断的学习和总结,不懂的就去网上找资料,就比如冒泡算法,也许在刚入门的程序员看来,不就是简单的两个 for 循环嘛,但是如果数据量很多的话,嵌套 for循环性能就很差了。

这两种方法的区别在于:

从执行次数上来区别:

for 循环会执行很多次,相当于执行了[arr.count*(arr.count-1)]/2次(等差函数的原理)

而上面说的那种算法,不是很好用公式来计算,但是远远没有嵌套执行次数多。

从耗时来区别:

在数据量不是特别庞大的话,嵌套和写的算法差不多,甚至还少;但是数据量大了就根本不是一个等级的了,测试的结果是在1万条数据下,嵌套要执行好几秒,而自定义的在一秒之内。

话不多说,下面介绍我的设计思路。

采用的折中二分的办法。





dispatch_async(dispatch_get_main_queue(), ^{

    NSMutableArray *arr = [NSMutableArray new];

    NSMutableArray *arr1 = [NSMutableArray new];

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

        [arraddObject:@(arc4random()%100)];

    }

//    arr = @[@(64),@(85),@(89),@(68),@(19),@(32)];

    NSLog(@"arr======%@",arr);

    [arrenumerateObjectsUsingBlock:^(id  _Nonnullobj,NSUIntegeridx,BOOL*_Nonnullstop) {

        NSNumber*objN = (NSNumber*)obj;

        if([arr1 lastObject].integerValue <= objN.integerValue){

            [arr1addObject:objN];

        }else{

            NSInteger maxIndex = arr1.count-1;//上次比较的最大位置

            NSInteger minIndex =0;//上次比较的最小位置

            NSInteger  index = ceilf((maxIndex - minIndex) /2.0);

            BOOLis =YES;

            while(is) {

                if(arr1[index].integerValue< objN.integerValue) {//中间的数值不大于 objN,往右移

                    if(objN.integerValue<= arr1[index+1].integerValue) {

                        //如果逻辑正确,index+1永远不会等于arr1.count

                        [arr1insertObject:objNatIndex:index+1];

                        is =NO;

                    }else{

                        minIndex = index;

                        index = minIndex +ceilf((maxIndex - minIndex) /2.0);

                    }

                }elseif(arr1[index].integerValue> objN.integerValue){//往左移

                    if(index ==0|| arr1[index-1].integerValue<= objN.integerValue) {

                        [arr1insertObject:objNatIndex:index];

                        is =NO;

                    }else{

                        maxIndex = index;

                        index = minIndex +floorf((maxIndex - minIndex) /2.0);

                    }

                }elseif(arr1[index].integerValue== objN.integerValue){

                    [arr1insertObject:objNatIndex:index];

                    is =NO;

                }else{

                    //程序异常

                }

            }

        }

    }];

    NSLog(@"arr1======%@",arr1);

});

你可能感兴趣的:(一个 iOS简单的冒泡算法)