顾名思义,冒泡就是泡泡一次次往上升。同理,排序中可以将大的泡泡一次次往后面提,提到最后以后,再次将前面的泡泡重复相同步骤找出最大的那个泡泡。
for(int i=0;i<random.length-1;i++) { // i<length-1是因为最后是[j+1]
for(int j=0;j<random.length-i-1;j++) { // length-i-1是因为大泡泡已经跑走了,剩下的泡泡不能有大泡泡了
if(random[j+1]<random[j]) { // 转值
int temp = random[j]; //中间数
random[j] = random[j+1];
random[j+1] = temp;
}
}
}
优化方案:
因为冒泡排序的时间复杂度为O(n2),上述代码中的整数数组逆序时要一直循环到最后才能真正循环完。但是正常情况下都已经完成排序了但循环依旧在进行。这个时候就能对代码进行优化,在循环中设置一个标签值,bool值什么的都随便,当一次循环当中发现没有泡泡相互转值时就可以认定排序已经完成,这个时候就是上述if代码段一次都没运行。那么可以改成下面这样。
int a=0;
for(int i=0;i<random.length-1;i++) {
for(int j=0;j<random.length-i-1;j++) {
if(random[j+1]<random[j]) {
int temp = random[j];
random[j] = random[j+1];
random[j+1] = temp;
a=1;
}
}
if(a==0) { // if代码段没循环,a=0即退出循环
break;
}
a=0;
}