美文网首页
IOS 算法(冒泡排序、系统排序API、二分法)

IOS 算法(冒泡排序、系统排序API、二分法)

作者: MMOTE | 来源:发表于2016-09-21 15:34 被阅读0次

    冒泡排序

    - (void)bubbleSort {

    NSArray* nums =@[@(8),@(3),@(4),@(6),@(9),@(7),@(5),@(2),@(1)];

    NSMutableArray* result = [numsmutableCopy];

    for(inti =0; i < [resultcount]; i++) {

    //我们每次都找到一个最大的数,每次都可以少比较一次。

    for(intj =0; j < [resultcount] -1- i; j++) {

    NSIntegerleft = [result[j]integerValue];

    NSIntegerright = [result[j +1]integerValue];

    if(left > right) {

    [resultexchangeObjectAtIndex:jwithObjectAtIndex:j +1];

    }

    }

    }

    NSLog(@"%@", result);

    系统提供的排序API

    //people对象,有age属性,按照age排序。

    NSArray* result1 = [numssortedArrayUsingComparator:^NSComparisonResult(NSNumber* obj1,NSNumber* obj2) {

    //obj1 ojb2数组中相邻的两个元素

    NSIntegerleft = [obj1integerValue];

    NSIntegerright = [obj2integerValue];

    if(left < right) {

    //NSOrderedAscending,不需要交换位置。

    returnNSOrderedAscending;

    }else{

    //NSOrderedDescending,需要交换位置。

    returnNSOrderedDescending;

    }

    }];

    NSLog(@"%@", result1);

    二分法

    - (void)binarySearch {

    NSMutableArray* nums = [[NSMutableArrayalloc]initWithCapacity:0];

    [numsaddObject:@(10)];

    for(inti =1; i <10000; i++) {

    [numsaddObject:@([nums[i -1]integerValue] +arc4random() %10)];

    }

    //42075

    //对于没有循环次数限制,只有跳出循环的条件,我们用while循环。

    NSIntegernum =arc4random() %10000;

    //需要找的数

    NSIntegeri = [nums[num]integerValue];

    //需要找的数的索引

    NSIntegerindex = -1;

    CFTimeIntervaltime1 =CACurrentMediaTime();

    //左边端点的索引

    NSIntegerleft =0;

    //右边端点的索引

    NSIntegerright = [numscount] -1;

    //中间点的索引

    NSIntegermid = [numscount] /2;

    while(YES) {

    //先和两个端点进行比较

    if([nums[left]integerValue] == i) {

    //左边=i

    index = left;

    //跳出循环

    break;

    }elseif([nums[right]integerValue] == i) {

    //

    index = right;

    break;

    }elseif([nums[mid]integerValue] == i) {

    index = mid;

    break;

    }elseif([nums[mid]integerValue] > i) {

    //中间> i

    //left已经比较过了,不符合条件。

    left = left +1;

    //中心点已经比较过了,不符合条件。

    right = mid -1;

    //

    mid = (left + right) /2;

    if(left > right) {

    //数组中没有符合条件的元素,跳出循环

    break;

    }

    }else{

    //中间< i

    left = mid +1;

    right = right -1;

    mid = (left + right) /2;

    if(left > right) {

    break;

    }

    }

    }

    CFTimeIntervaltime2 =CACurrentMediaTime();

    //传统的便利方法,通过时间加以比较两者的差距

    CFTimeIntervaltime3 =CACurrentMediaTime();

    for(intj =0; j < [numscount]; j++) {

    NSIntegervalue = [nums[j]integerValue];

    if(value == i) {

    break;

    }

    }

    CFTimeIntervaltime4 =CACurrentMediaTime();

    NSLog(@"%f------%f", time2 - time1, time4 - time3);

    NSLog(@"%@------%d------%d", index == -1?@"没有找到":@"找到", index, num);

    }

    相关文章

      网友评论

          本文标题:IOS 算法(冒泡排序、系统排序API、二分法)

          本文链接:https://www.haomeiwen.com/subject/szeaettx.html