冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端,像泡泡一样浮出水面。
- 一趟排序中,最好加上一个标签flag来判断是否发生了交换,如果发生了交换,则立马跳出循环,此时冒泡排序算法得到了优化。如果没有发生,则将flag还原成初始值继续遍历。
- 排序次数=元素个数-1
import java.util.Arrays;
public class Test {
//冒泡排序
public static void main(String[] args){
int a[] = {-1,-6,6,5,7,3};
int temp = 0;
//第一趟排序,此时的最大数在最后一位。
for(int i=0;i<a.length-1-0;i++){
if(a[i]<=a[i+1]){
temp =a[i];
a[i] = a[i+1];
a[i+1]=temp;
}
}
System.out.println("第一趟排序:"+Arrays.toString(a));
//第二趟排序,此时的最大数在倒数第二位。
for(int i=0;i<a.length-1-1;i++){
if(a[i]<=a[i+1]){
temp =a[i];
a[i] = a[i+1];
a[i+1]=temp;
}
}
System.out.println("第二趟排序:"+Arrays.toString(a));
//第三趟排序,此时的最大数在倒数第三位。
for(int i=0;i<a.length-1-1-1;i++){
if(a[i]<=a[i+1]){
temp =a[i];
a[i] = a[i+1];
a[i+1]=temp;
}
}
System.out.println("第三趟排序:"+Arrays.toString(a));
//第四趟排序,此时的最大数在倒数第四位。
for(int i=0;i<a.length-1-1-1-1;i++){
if(a[i]<=a[i+1]){
temp =a[i];
a[i] = a[i+1];
a[i+1]=temp;
}
}
System.out.println("第四趟排序:"+Arrays.toString(a));
//第五趟排序,此时的最大数排在第五位。
for(int i=0;i<a.length-1-1-1-1-1;i++){
if(a[i]<=a[i+1]){
temp =a[i];
a[i] = a[i+1];
a[i+1]=temp;
}
}
System.out.println("第五趟排序:"+Arrays.toString(a));
System.out.println("优化后的算法-----");
//通过上面冒泡排序,发现有些细节可以优化。
//i<length-1.....i<length-5,,而length=6,所以在for循环中,应是i<a.length
int b[] = {-1,-6,6,5,7,3};
boolean flag = false; //变量表示的意思是在正确的时候发生了交换。
for(int i=1;i<b.length;i++){
for(int j=0;j<b.length-i;j++){
if(b[j]<=b[j+1]){
temp =b[j];
b[j] = b[j+1];
b[j+1]=temp;
}
flag = true; //发生了交换。
}
if(flag){
flag = false; //如果发生了交换,则原地不动,将flag标签进行恢复最初的状态。
}
else{
break; //没有发生交换,算法得此进行了优化。
}
}
System.out.println(Arrays.toString(b));
}
}