冒泡排序详解

冒泡排序详解

思路分析

  1. 冒泡排序是使用频率较高的一种排序算法
  2. 每一次循环都将最大的数向后移动,第一次循环将最大的数移动到最后的位置,第二次循环将倒数第二大的数移动到倒数第二的位置,依次类推
  3. 外层循环 len - 1次,每次将最大的数向后移动
  4. 内层循环 len - 1 - i 次,每次比较当前数和后一个数,如果前边的数大于后边的数,则交换位置
  5. 循环次数 是长度 - 1是因为如果有 n 个数,即长度为 n ,则只需要进行 n - 1次循环,剩下的数不用动
  6. 考虑冒泡的优化:
  7. 即如果在某一次的循环比较过程中如果没有发生数据的交换,则说明当前数组元素已经有序,返回即可
  8. 使用一个标志位即可
  9. 源码见下

源码及分析

/**
     * 编写方法实现冒泡排序
     *
     * @param arr 要排序的数组
     *            <p>
     *            考虑冒泡排序的优化
     *            即如果在某次比较后,如果各个元素都没有交换位置,则说明数组中的元素已经排好序
     *            则结束排序
     *            设置标志位,判断是否交换位置
     */
    public static void bubble(int[] arr) {
        //定义遍历保存数组的长度
        int len = arr.length;
        //定义临时变量tmp用于辅助交换
        int tmp = 0;
        //定义变量 flag标志位判断是否交换
        boolean flag = false;
        //外层循环 len - 1 次,每次将数组中剩下的较大的数向后移动
        for (int i = 0; i < len - 1; i++) {
            //内层循环每次比较,将较大的数向后移动
            for (int j = 0; j < len - 1 - i; j++) {
                //如果前边的数大于后边的数,则交换两数的位置
                if (arr[j] > arr[j + 1]) {
                    flag = true;
                    tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                }
            }
            //如果某次循环中个元素并没有交换位置,则直接结束,否则flag 仍置为false
            if (!flag) {
                return;
            } else {
                flag = false;
            }
        }
    }
posted @ 2021-05-30 21:11  mx_info  阅读(176)  评论(0)    收藏  举报