普通冒泡:
for(int i=0;i<a.length;i++){
for(int j=1;j<a.length-i;j++){
if(a[j]<a[j-1]){
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
缺点: 遍历中,即使后方元素已经确定位置或者已经有序,还是会挨个比较。
优化一:
添加有序标识符
for(int i=0;i<a.length;i++){
boolean is=true;
for(int j=1;j<a.length-i;j++){
if(a[j]<a[j-1]){
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
is=false;
}
}
if(is)break;
}
缺点: 虽然有可能 会减少循环遍历的次数,但是在最坏的情况下会比原来的冒泡消耗更多的空间内存。
优化二:
动态移动最大数组下标
int index=a.length;
for(int i=0;i<index;i++){
for(int j=1;j<a.length-i;j++){
if(a[j]<a[j-1]){
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
index=j;
}
}
}
暂时想到的最好的优化方法, 本质就是当冒泡出最后一个最大的那个元素后,将循环的下标移动到该元素前一个,因为已经可以判断移动改元素到最后之后,前面的元素都比改元素小无需比较了