自己来实现一个简单的冒泡算法,除了可以用系统的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);
});