冒泡排序
- 方法的第一行
public static void sort(int[] arr):
这是一个公共静态方法,可以通过类名直接访问,它接受一个整数数组arr作为参数,没有返回值。 - 接着,第一个
for循环for (int i = 0; i < arr.length - 1; i++):
这个循环控制排序的轮数,从数组的第一个元素到倒数第二个元素。 - 在第一个循环中,初始化一个布尔变量
swapped为false:
swapped变量用于标记在当前轮排序中是否有元素被交换。 - 然后,第二个
for循环for (int j = 0; j < arr.length - 1 - i; j++):
这个循环控制每一轮中的比较次数。随着i的增加,每一轮需要比较的元素逐渐减少。 - 在第二个循环中,使用
if语句if (arr[j] > arr[j + 1]):
比较相邻的两个元素,如果当前元素arr[j]比下一个元素arr[j + 1]大,就交换它们的位置。 - 在
if语句中,交换元素的代码int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp;:
将较大的元素向后移动,并将较小的元素放到它的位置上。 - 元素交换后,设置
swapped为true:
这一步用于标记已经发生了交换操作。 - 第二个循环结束后,使用
if语句if (!swapped) break;:
检查swapped变量是否为false,如果为false,表示在本轮循环中没有发生任何交换,即数组已经是有序的,此时可以提前终止排序过程。 - 第一个循环结束,排序完成。
冒泡排序的平均和最坏情况时间复杂度都是 O(n^2),其中 n 是数组的长度。这是因为需要两层嵌套循环来比较元素。尽管它的最坏情况性能不佳,但对于小型数据集或者部分有序的数据集,冒泡排序仍然是一种简单易懂且有效的排序算法。
/**
* 冒泡排序
*/
public class BubbleSort {
public static void main(String[] args) {
int[] arr = new int[]{3, 5, 22, 111, 5};
sort(arr);
}
public static void sort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
boolean swapped = false;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (!swapped) {
break;
}
}
}
}