冒泡排序
- 概述
冒泡排序(Bubble Sorting) 的基本思想就是对于待排序序列从前向后,依次比较相邻元素的值,如果出现逆序则交换。冒泡其实就是比较交换,如果是从小到大排序,则每一轮冒泡就能将序列的最大值交换到序列的尾部,从而确定下来。 - 图解分析
分析:
1)假定待排序序列是数组arr。
2)要让数组元素变得完全有序,我们需要完成arr.length-1轮冒泡(为什么?因为我们要确定arr.length-1个最大值,数组的顺序才可以确定下来,而每一轮比较交换能确定一个最大值,所以需要arr.length-1轮比较交换,即冒泡)。例如,数组长度为6,要完成6-1=5轮冒泡。
3)每轮冒泡要比较的次数为arr.length-1-i,其中i表示第i轮冒泡或者已经确定的最大值的个数,编程时从0开始。例如,第0轮冒泡需要比较的次数为6-1-0,已经确定的最大值的个数为0;第1轮冒泡需要比较的次数为6-1-1,已经确定的最大值的个数为1;第2轮冒泡需要比较的次数为6-1-2,已经确定的最大值的个数为2;第3轮冒泡需要比较的次数为6-1-3,已经确定的最大值的个数为3;第4轮冒泡需要比较的次数为6-1-4,已经确定的最大值的个数为4。
4)由于每一轮冒泡都可以确定下来一个最大值(在下一轮的比较中不用管它)放到数组尾部,所以每一轮冒泡比较的次数是在递减的。 - 代码实现
public static void bubbleSort(int[] arr) {
int temp;
for (int i = 0; i < arr.length - 1; i++) {
int count = 0;
boolean flag = false;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
flag = true;
count++;
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
System.out.printf("第%d轮冒泡交换的次数为%d\n", i, count);
System.out.println("第"+i+"轮排序后:" + Arrays.toString(arr));
if (!flag) {
break;
}
}
}