不会吧,不会吧,居然还有人不知道冒泡排序——最详解释,小白一看就会

冒泡排序
  • 原理:每一轮循环总能确定一个数的最终位置

    • 例如,从小到大排序,第一轮循环是找一个最大的一个数,最大的一个数在第一个,那么它就会依次和第二个数,第三个数,第三个数。。。。交换位置,最终它在最后一位。
      在这里插入图片描述
  • 步骤:从首位起,一次性比较两个元素,如果这两个元素位置顺序错误,那么就交换位置,反之不交换

  • 注意

    • 从小到大排序,外层循环第一轮循环完后会找到最大的数
    • 从大到小排序,外层循环第一轮循环完后会找到最小的数
  • 编程思路:

    • 外层循环:每一轮循环找到最大或最小的数并确定它的位置
    • 内层循环:每一轮循环比较两个数的大小有必要则交换
    • 循环次数(以{3,2,4,1,5,0}为例)
      • 外层循环:一共六个数,后五个数的位置确定,第一个数也就自然确定,所以只需要循环五次,则arr.length-1
      • 内层循环:六个数,两两比较,也只需要五次(不信你扳手指,相邻的两两手指打架,五根手指打四次架)则也是arr.length-1
  • 代码为例:

    package cn.javase.selfstudy;
    
    public class ArrayBubbleSort {
        public static void main(String[] args) {
            int[] arr = new int[]{10, 12, 33, 6, 90, 46, 1, 5, 7, 3};//静态初始化一个数组
            System.out.print("[");
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + (i < arr.length - 1 ? "," : "]"));
            }//6789行打印原数组元素
            System.out.println();
            System.out.println("---------------------");//10 11行分界线
            for (int i = 0; i < arr.length - 1; i++) {//外层循环每一轮找到最大的数并确定位置
                for (int j = 0; j < arr.length - 1; j++) {//内层循环每一轮比较有必要则交换
                    if (arr[j] > arr[j + 1]) {//如果前一个数大于后一个数则交换
                        arr[j] = arr[j] + arr[j + 1];
                        arr[j + 1] = arr[j] - arr[j + 1];
                        arr[j] = arr[j] - arr[j + 1];
                    }
                    System.out.print("[");
                    for (int x = 0; x < arr.length; x++) {
                        System.out.print(arr[x] + (x < arr.length - 1 ? "," : "]"));
                    }
                    System.out.println();//19 20 21 22 23行打印每一次比较后的结果
                }
    
    
            }
            System.out.println("---------------------");
            System.out.print("[");
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + (i < arr.length - 1 ? "," : "]"));
            }//29 30 31 32行打印排序后的数组元素
        }
    }
    
    
    [10,12,33,6,90,46,1,5,7,3]//原数组
    ---------------------
        //外层循环一次空一行以示区分
        //每一行都是交换后的结果
    [10,12,33,6,90,46,1,5,7,3]//10和12比较不交换
    [10,12,33,6,90,46,1,5,7,3]//12和33比较不交换
    [10,12,6,33,90,46,1,5,7,3]//33和6比较交换
    [10,12,6,33,90,46,1,5,7,3]//33和90比较不交换
    [10,12,6,33,46,90,1,5,7,3]//90和46比较交换
    [10,12,6,33,46,1,90,5,7,3]//90和1交换
    [10,12,6,33,46,1,5,90,7,3]//90和5交换
    [10,12,6,33,46,1,5,7,90,3]//90和7交换   
    [10,12,6,33,46,1,5,7,3,90]//90和3交换
        //最终把最大的90确定到了最末的位置
        //大家看,90依次往后移动,像不像泡泡浮出水
    [10,12,6,33,46,1,5,7,3,90]
    [10,6,12,33,46,1,5,7,3,90]
    [10,6,12,33,46,1,5,7,3,90]
    [10,6,12,33,46,1,5,7,3,90]
    [10,6,12,33,1,46,5,7,3,90]
    [10,6,12,33,1,5,46,7,3,90]
    [10,6,12,33,1,5,7,46,3,90]
    [10,6,12,33,1,5,7,3,46,90]
    [10,6,12,33,1,5,7,3,46,90]//重复比较
        //确定了倒数第二大46的位置
    [6,10,12,33,1,5,7,3,46,90]
    [6,10,12,33,1,5,7,3,46,90]
    [6,10,12,33,1,5,7,3,46,90]
    [6,10,12,1,33,5,7,3,46,90]
    [6,10,12,1,5,33,7,3,46,90]
    [6,10,12,1,5,7,33,3,46,90]
    [6,10,12,1,5,7,3,33,46,90]
    [6,10,12,1,5,7,3,33,46,90]//重复比较
    [6,10,12,1,5,7,3,33,46,90]//重复比较
        //确定了倒数第三大33的位置
    [6,10,12,1,5,7,3,33,46,90]
    [6,10,12,1,5,7,3,33,46,90]
    [6,10,1,12,5,7,3,33,46,90]
    [6,10,1,5,12,7,3,33,46,90]
    [6,10,1,5,7,12,3,33,46,90]
    [6,10,1,5,7,3,12,33,46,90]
    [6,10,1,5,7,3,12,33,46,90]//重复比较
    [6,10,1,5,7,3,12,33,46,90]//重复比较
    [6,10,1,5,7,3,12,33,46,90]//重复比较
        //确定了倒数第4大12的位置
    [6,10,1,5,7,3,12,33,46,90]
    [6,1,10,5,7,3,12,33,46,90]
    [6,1,5,10,7,3,12,33,46,90]
    [6,1,5,7,10,3,12,33,46,90]
    [6,1,5,7,3,10,12,33,46,90]
    [6,1,5,7,3,10,12,33,46,90]//重复比较
    [6,1,5,7,3,10,12,33,46,90]//重复比较
    [6,1,5,7,3,10,12,33,46,90]//重复比较
    [6,1,5,7,3,10,12,33,46,90]//重复比较
        //确定了10的位置
    [1,6,5,7,3,10,12,33,46,90]
    [1,5,6,7,3,10,12,33,46,90]
    [1,5,6,7,3,10,12,33,46,90]
    [1,5,6,3,7,10,12,33,46,90]
    [1,5,6,3,7,10,12,33,46,90]//重复比较
    [1,5,6,3,7,10,12,33,46,90]//重复比较
    [1,5,6,3,7,10,12,33,46,90]//重复比较
    [1,5,6,3,7,10,12,33,46,90]//重复比较
    [1,5,6,3,7,10,12,33,46,90]//重复比较
        //确定了7的位置
    [1,5,6,3,7,10,12,33,46,90]
    [1,5,6,3,7,10,12,33,46,90]
    [1,5,3,6,7,10,12,33,46,90]
    [1,5,3,6,7,10,12,33,46,90]//重复比较
    [1,5,3,6,7,10,12,33,46,90]//重复比较
    [1,5,3,6,7,10,12,33,46,90]//重复比较
    [1,5,3,6,7,10,12,33,46,90]//重复比较
    [1,5,3,6,7,10,12,33,46,90]//重复比较
    [1,5,3,6,7,10,12,33,46,90]//重复比较
        //确定了6的位置
    [1,5,3,6,7,10,12,33,46,90]
    [1,3,5,6,7,10,12,33,46,90]
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
        //确定了5的位置
    [1,3,5,6,7,10,12,33,46,90]
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
    [1,3,5,6,7,10,12,33,46,90]//重复比较
        //确定了1和3的位置
    ---------------------
    [1,3,5,6,7,10,12,33,46,90]//最终结果
    

    大家也看到了,重复比较的太多了,可以对算法进行优化,接下来的优化就交给大家来完成吧。

猜你喜欢

转载自blog.csdn.net/weixin_44115522/article/details/107429400