冒泡排序

304 阅读1分钟

冒泡排序是一种简单直接的排序算法。它依次对比两个相邻的元素,如果顺序错误交换他们的值,然后重复这个过程,直到没有需要交换的的元素,即排序完成。

Java实现

        Integer[] arr = new Integer[]{43, 77, 29, 39, 66, 83, 104, 93, 11, 10, 18, 27};

        for (int i = 1; i < arr.length; i++) {
            // 每一次内循环都可以找出一个最大值,如arr数组,第一次内循环找出最大值104
            // 第二次内循环找出最大值93。。。。第11次内循环找出最大值11,剩下最后一个元素10就是最小值,不需要在做比较
            // 所以总共要执行length-1次内循环做对比,即i的初始值是1

            boolean flag = false;// 定义一个代表内循环是否进行过交换的标识

            for (int j = 0; j < arr.length - i; j++) {
                // 数组总长度是length,内循环是前后两个元素依次对比,第1次循环时,内循环需要对比length-1次,所以i初始值是1
                // 第1次内循环结束后,能找出1个最大值,所以第2次循环可以少对比2次,即length-2次
                // 由此可推导出,第i次外循环时,内循环需要对比length-i次,即length-i
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = true;
                }
            }

            if (!flag) {
                // 如果某一次内循环对比结束后,没有进行过交换,说明数组已经排好顺序了
                break;
            }
        }

        for (Integer integer : arr) {
            System.out.println(integer + "");
        }
    }

输出结果: 10 11 18 27 29 39 43 66 77 83 93 104

算法步骤

  1. 比较两个相邻的元素,如果第一个比第二个大,就交换他们的值。即内循环内部实现的逻辑
  2. 对比每一对相邻的元素做步骤1的操作,直到最后一对元素。执行完之后会找出最大的元素。即整个内循环的逻辑
  3. 将步骤1、2的操作重复执行,直到没有需要对比的元素。即整个外循环的逻辑