冒泡排序很简单
但是冒泡会涉及优化
首先我们对冒泡的过程进行思考,当我们排到某个时候数组其实已经是有序的了,接下来我们可以不用再排,这种情况我们可以用一个标志变量来记录,当我进行一次冒泡的过程中没有进行交换,我们可以设置flag=true 那么在进入下次冒泡时我们可以先判断flag ,在flag为true的情况下,我们完全可以结束此次循环,甚至是整个循环过程
代码如下:
<span style="font-size:18px;">//原生冒泡
public static void sort(Comparable[] a ){
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length-i-1; j++) {
if(!less(a[j],a[j+1]))exch(a, j, j+1);
}
}
}</span>
<span style="font-size:18px;">//通过标志位优化
public static void sort2(Comparable[] a ){
boolean flag=false;
for (int i = 0; i < a.length; i++) {
if (!flag) {
flag=true;
for (int j = 0; j < a.length-i-1; j++) {
if(!less(a[j],a[j+1])){exch(a, j, j+1);flag=false;}
}
}
}
}</span>
然而还有更好的办法 ,开始的优化是全部有序时跳过冒泡,那么部分有序时我们也可以做些优化,我们可以记录最后一次交换发生的位置,说明记录的位置之后都是没有发生交换的,即有序的,所以当冒泡进行到我们的记录点时后续的循环就可以跳过了。
代码如下:
<span style="font-size:18px;">//记录最后交换点优化
public static void sort3(Comparable[] a ){
int pos=-1;
int postemp=0;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length-i-1; j++) {
if(pos==j)break;
if(!less(a[j],a[j+1])){exch(a, j, j+1);postemp=j;};
}
pos=postemp;
}
}</span>