基础算法学习 | 2.冒泡排序

79 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

image.png

往期内容

基础算法学习 | 1.二分查找

前言

书接上回,上期学习的二分查找,今天来学习一下冒泡排序,希望大家共同讨论,有所收获!!!

算法描述

  • 依次比较数组中相邻两个元素大小,若 a[j] > a[j+1],则交换两个元素,两两都比较一遍称为一轮冒泡,结果是让最大的元素排至最后
  • 重复以上步骤,直到整个数组有序

算法实现

public static void bubble(int[] a) {
    for (int j = 0; j < a.length - 1; j++) {
        for (int i = 0; i < a.length - 1 - j; i++) {
            if (a[i] > a[i + 1]) {
                int tmp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = tmp;
            }
        }
        System.out.println("第" + j + "轮冒泡" + Arrays.toString(a));
    }
}

测试代码

public static void main(String[] args) {
    int[] array = {1, 40, 47, 3, 20, 35, 49, 60, 8, 11, 48};
    bubble(array);
}

运行结果

0轮冒泡[1, 40, 3, 20, 35, 47, 49, 8, 11, 48, 60]1轮冒泡[1, 3, 20, 35, 40, 47, 8, 11, 48, 49, 60]2轮冒泡[1, 3, 20, 35, 40, 8, 11, 47, 48, 49, 60]3轮冒泡[1, 3, 20, 35, 8, 11, 40, 47, 48, 49, 60]4轮冒泡[1, 3, 20, 8, 11, 35, 40, 47, 48, 49, 60]5轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]6轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]7轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]8轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]9轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]

优化思路

  • 优化点1:每经过一轮冒泡,内层循环就可以减少一次
  • 优化点2:如果某一轮冒泡没有发生交换,则表示所有数据有序,可以结束外层循环

优化代码

public static void bubble_v2(int[] a) {
    int n = a.length - 1;
    // 轮数
    int j = 0;
    do {
        j++;
        // 表示最后一次交换索引位置
        int last = 0;
        for (int i = 0; i < n; i++) {
            if (a[i] > a[i + 1]) {
                int tmp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = tmp;
                last = i;
            }
        }
        n = last;
        System.out.println("第" + j + "轮冒泡" + Arrays.toString(a));
    } while (n != 0);
}

测试代码

public static void main(String[] args) {
    int[] array1 = {1, 40, 47, 3, 20, 35, 49, 60, 8, 11, 48};
    bubble_v2(array1);
}

运行结果

1轮冒泡[1, 40, 3, 20, 35, 47, 49, 8, 11, 48, 60]2轮冒泡[1, 3, 20, 35, 40, 47, 8, 11, 48, 49, 60]3轮冒泡[1, 3, 20, 35, 40, 8, 11, 47, 48, 49, 60]4轮冒泡[1, 3, 20, 35, 8, 11, 40, 47, 48, 49, 60]5轮冒泡[1, 3, 20, 8, 11, 35, 40, 47, 48, 49, 60]6轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]7轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]

大家多多讨论学习salute

image.png