iOS常用算法之冒泡排序

冒泡算法是一种基础的排序算法,这种算法会重复的比较数组中相邻的两个元素,如果一个元素比另一个元素大/小,那么就交换这两个元素的位置。重复一直比较到最后一个元素.

1.基本的冒泡排序算法:

-(void)bubbleSorting{
    int count = 0;
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@3,@2,@9,@1,@6,@7,@4,@5,@8,nil];
    NSLog(@"排序之前的数组===%@",array);
        for (int i = 0; i< array.count -1; i++) {//外循环
            for (int j = 0; j < array.count -1; j++) {//内循环
                count++;
                if ([array[j] integerValue] >[array[j+1] integerValue] ) {
                    [array exchangeObjectAtIndex:j withObjectAtIndex:j+1];
                }
            }
        }
    NSLog(@"排序后的数组===%@",array);
    NSLog(@"循环次数%d",count);
}

//运行结果
2021-03-04 16:04:22.999082+0800 test[15616:230187] 排序之前的数组===(
    3,
    2,
    9,
    1,
    6,
    7,
    4,
    5,
    8
)
2021-03-04 16:04:22.999237+0800 test[15616:230187] 排序后的数组===(
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9
)
2021-03-04 16:04:22.999307+0800 test[15616:230187] 循环次数64

这样写的冒泡排序需要比对(数组的个数-1)的平方次,每一圈内循环都把最大的数换到最后,如上:第一圈9被替换到最后一个元素位置,第二圈8被替换到倒数第二个元素的位置,那么8和9还需要比对么,答案是否定的,所以可以对上述方法进行第一次优化

2.第一次优化

-(void)bubbleSorting1{
    int count = 0;
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@3,@2,@9,@1,@6,@7,@4,@5,@8,nil];
    NSLog(@"排序之前的数组===%@",array);
        for (int i = 0; i< array.count -1; i++) {
            for (int j = 0; j < array.count -1 -i; j++) {
                count++;
                if ([array[j] integerValue] >[array[j+1] integerValue] ) {
                    [array exchangeObjectAtIndex:j withObjectAtIndex:j+1];
                }
            }
        }
    NSLog(@"排序后的数组===%@",array);
    NSLog(@"循环次数%d",count);
}

//运行结果
2021-03-04 16:26:09.737658+0800 test[16483:244359] 排序后的数组===(
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9
)
2021-03-04 16:26:09.737712+0800 test[16483:244359] 循环次数36

可以看到优化后只需要循环36次,为什么呢?因为每一圈内循环最后两个数都不用比较,所以每一圈内循环次数都相对上一轮少1,所以总的比对次数为1+2+..+(数组的个数-1)。那么,是否还可以继续优化,答案是可以的,那就是当循环结束前,数组已经排好顺序了,那么后面的比较就没有必要了,可以跳出循环。

2.第二次优化

-(void)bubbleSorting2{
    int count = 0;
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@3,@2,@9,@1,@6,@7,@4,@5,@8,nil];
    NSLog(@"排序之前的数组===%@",array);
        for (int i = 0; i< array.count -1; i++) {
            BOOL isEnd = NO;//判断是否已排序完成
            for (int j = 0; j < array.count -1 -i; j++) {
                count++;
                if ([array[j] integerValue] >[array[j+1] integerValue] ) {
                    isEnd = YES;
                    [array exchangeObjectAtIndex:j withObjectAtIndex:j+1];
                }
            }
            if (!isEnd) {
                break;
            }
        }
    NSLog(@"排序后的数组===%@",array);
    NSLog(@"循环次数%d",count);
}

//运行结果
2021-03-04 16:38:08.899639+0800 test[16965:252277] 排序后的数组===(
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9
)
2021-03-04 16:38:08.899709+0800 test[16965:252277] 循环次数26

当然这个数值是不是固定的,是小于等于第一次优化后的循环次数的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值