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

冒泡排序

- (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、二分法))