冒泡排序(Bubble Sort):从左至右(从下标较小的元素开始)依次比较相邻元素的值,若发现逆序则交换,使较大的元素逐渐从前移向后部。
冒泡排序的规则(以数组 arr= {3, 9, -1, 10, 20}为例):
1.一共进行数组的大小 - 1 (arr.length - 1) 次的大循环(趟数);
2.每一趟(每一次大循环)排序的次数逐渐减少:第一趟下来后,最大的数已经确定下来(在数组的最后),因此第二趟较第一趟排序对比的次数少;
3.优化方案:如果我们发现在某趟排序中,没有发生过一次交换,则可以提前结束冒泡排序。可在排序过程中设置一个标识(flag),用于判断元素是否进行过交换。
Java实现如下所示:
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args){
int[] arr = {3, 9, -1, 10, 20};; //{3, -1, 9, 10, 20};//{3, 9, -1, 10, 20};
bubbleSort(arr);
//System.out.println(Arrays.toString(arr));
}
//冒泡排序算法
public static void bubbleSort(int[] arr){
int temp = 0;
boolean flag = false; //标识变量,标识冒泡过程中是否进行过交换
//冒泡排序的时间复杂度为 O(n^2)
for(int i=0; i<arr.length-1; i++){ //外循环是冒泡排序的趟数
for(int j=0; j<arr.length-1-i; j++){ //因为每一趟都能确定最大的那个数,放在最后
//如果前面的数比后面的大,则交换,把大的放在后面
if(arr[j] > arr[j+1]){
flag = true;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println("第" + (i+1) + "趟排序: " + Arrays.toString(arr));
if(flag == false){ //在一趟排序中,一次位置交换都没有发生过
break;
}else{
flag = false; //重置flag 进行下趟判断,如果不重置flag,则flag为true后,则无法跳出循环,优化就无从谈起
}
}
}
}
特别要注意的是 flag 在不等于false时,要重置其为false,从而进行下次判断,如果不重置flag,则flag为true后,则无法跳出循环,优化就无从谈起