排序动图
排序流程
依次比较向相邻两个数,如果后面的比前面大,则交换位置。
-
总共比较几轮?
总共比较
n-1
轮,因为最后一个数字没有后一个数。 -
每一轮比较几次?
第一轮需要比较
n-1
次。第二轮需要比较
n-2
次,因为最后一个数已经是最大的了,不需要再重新比较。由此可得出,每轮比较
n - 已经比较了几轮 - 1
。初始数组:int[] arr = new int[]{3, 2, 5, 1, 6, 8, 9, 4, 7} 第一轮第一次:2 3 5 1 6 8 9 4 7 第一轮第二次:2 3 5 1 6 8 9 4 7 第一轮第三次:2 3 1 5 6 8 9 4 7 第一轮第四次:2 3 1 5 6 8 9 4 7 第一轮第五次:2 4 1 6 5 8 9 4 7 第一轮第六次:2 4 1 6 5 8 9 4 7 第一轮第七次:2 4 1 6 5 8 9 4 7 第一轮第八次:2 4 1 6 5 8 4 9 7 第一轮第九次:2 4 1 6 5 8 4 7 9
经过一轮的九次比较交换的得出了最大的值 9,并排在了最后一位,此后的每一轮都能找出最大的一位,并排在最后一位。
代码实现
public static int[] bubbleSort(int[] arr) {
// 总共比较数组的长度 - 1 轮
for (int i = 0; i < arr.length - 1; i++) {
// 每轮比较数组的长度 - i - 1 轮
for (int j = 0; j < arr.length - i - 1; j++) {
// 如果后面的前面的大
if (arr[j] > arr[j+1]) {
// 交换位置
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
代码优化
试想一下,有没有一种可能,这个数组本来就是已经排好序的了,那么我们就不需要在循环排序了。
如何判断数组是否已经排好序了呢?
假如一轮循环,都没有发生位置交换,那么就可以认为该数组已经排好序了。
public static int[] newBubbleSort(int[] arr) {
// 定义一个替换中间变量
int temp;
// 定义一个标志,标志一轮循环是否发生了交替
int change;
// 循环比较第几轮
for (int i = 0; i < arr.length - 1; i++) {
// 设置标志为 0
change = 0;
// 每轮比较的次数
for (int j = 0; j < arr.length - i - 1; j++) {
// 后面的数大于前一个数,位置替换
if (arr[j+1] < arr[j]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
// 已经比较,修改标志
change = 1;
}
}
// 如果一轮循环都没有发生交替,则说明数组已经排好序,结束排序
if (change == 0) {
return arr;
}
}
return arr;
}