冒泡算法是一种基础的排序算法,这种算法会重复的比较数组中相邻的两个元素,如果一个元素比另一个元素大/小,那么就交换这两个元素的位置。重复一直比较到最后一个元素.
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
当然这个数值是不是固定的,是小于等于第一次优化后的循环次数的。