冒泡排序

93 阅读2分钟

冒泡排序

  • 方法的第一行 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;
        }
    }
}


}