zoukankan      html  css  js  c++  java
  • 冒泡算法--通俗易通

     冒泡算法相对来说算是比较简单的了,希望看官在看的时候,千万不要急,我已经把每一轮的分解过程写出来了,然后再写一个总的排序,希望对你有所帮助。

    一.冒泡算法介绍

      定义:

        通过对无序数组列表的下标开始依次对相邻元素的值进行比较,若发现逆序则交换,使较大的元素逐渐从前向移,就像水底的气泡一样逐渐向上冒泡。

      排序思想:

        冒泡是通过2个循环来进行排序的,内循环每1轮排出的元素是在当前数组中相对较大的元素,外循环则是对元素的个数进行循环。
      冒泡算法分为2种:
        1.一种是利用内、外循环的脚标来确定二个数,进行比较。
        2.另一种是利用内存循环的脚标、内循环脚标+1来确定2个数,来进行比较

     

    二.代码实现

      1.分步实现

      2.整体实现

      3.优化步骤

    三.时间复杂度

      冒泡算法是通过内外循环而来的,那么它的规模则是O(n^2),即内外循环循环的次数相乘,就是这个算法执行的规模,想想是不是很大。

      分步实现过程

    package com.zpb.bubbling;
    
    import java.util.Arrays;
    
    /**
     * @des                                  
     * @author  zhao
     * @date    2019年10月28日下午11:02:06
     * 
     */
    public class BubblingSort {
        
        public static void main(String[] args) {
            int arr[] ={101,34,119,1};
            bubblingSort(arr);
        }
        
        public static void bubblingSort(int arr[]) {
            //对于一个数组排序,我们先将排序分成多轮进行,
            
            //第1轮排序:========================================================= 101 和 34 进行排序
            int temp = 0;
            for (int j = 0; j < arr.length -1- 0; j++) {    //-1是因为最后一个数是不需要排序的,-0是从arr[0]的位置开始
                if(arr[j] > arr[j+1]) {                    //如果前1个数大于后一个数,那么就将其进行交换位置
                    temp = arr[j];                        //我们先将前1个数存放到临时变量中
                    arr[j] = arr[j+1];                    //将后1个变量赋值给前1个变量
                    arr[j+1] = temp;                    //再将刚才的临时变量存储的值,赋值给后1个变量
                    //这个过程就好比,你端了一杯红酒,我端了一杯啤酒,你想喝我的啤酒,所以我们就找了一个临时的空杯子,我将啤酒倒在空杯子中,你将红酒倒
                    //在了我的杯子中,然后又将临时空杯子中的啤酒倒进了你的杯子中
                }
            }
            System.out.println("第1轮排序完成后:"+Arrays.toString(arr));    //[34, 101, 1, 119]
            
            //第2轮排序:=========================================================  101 和 1 进行排序
            //请注意:在第2次排序的时候数组的位置已经变化了,关键点在于,在第1次排序之前,第1个元素和第2个元素已经交换过位置,所以在第2次排序的时候,其实
            //是从第2个位置开始进行排序的,这个点很关键,请一定要记住!!!
            for (int j = 0; j < arr.length -1 -1; j++) { //-1是因为最后一个数是不需要排序的,-1是从arr[1]的位置开始
                if(arr[j] > arr[j+1]) {                     //如果前1个数大于后一个数,那么就将其进行交换位置
                    temp = arr[j];                         //我们先将前1个数存放到临时变量中
                    arr[j] = arr[j+1];                     //将后1个变量赋值给前1个变量
                    arr[j+1] = temp;                     //再将刚才的临时变量存储的值,赋值给后1个变量
                    //这个过程就好比,你端了一杯红酒,我端了一杯啤酒,你想喝我的啤酒,所以我们就找了一个临时的空杯子,我将啤酒倒在空杯子中,你将红酒倒
                    //在了我的杯子中,然后又将临时空杯子中的啤酒倒进了你的杯子中
                }
            }
            System.out.println("第2轮排序完成后:"+Arrays.toString(arr));    //[34, 1, 101, 119]
            
            //第3轮排序:=========================================================  101  和119 进行排序
            for (int j = 0; j < arr.length -1 -2; j++) {    //-1是因为最后一个数是不需要排序的,-2是从arr[2]的位置开始
                if(arr[j] > arr[j+1]) {                    //如果前1个数大于后一个数,那么就将其进行交换位置
                    temp = arr[j];                        //我们先将前1个数存放到临时变量中
                    arr[j] = arr[j+1];                    //将后1个变量赋值给前1个变量
                    arr[j+1] = temp;                    //再将刚才的临时变量存储的值,赋值给后1个变量
                    //这个过程就好比,你端了一杯红酒,我端了一杯啤酒,你想喝我的啤酒,所以我们就找了一个临时的空杯子,我将啤酒倒在空杯子中,你将红酒倒
                    //在了我的杯子中,然后又将临时空杯子中的啤酒倒进了你的杯子中
                }
            }
            System.out.println("第3轮排序完成后:"+Arrays.toString(arr));    //[1, 34, 101, 119]
            
            //第4轮排序:=========================================================  101 和119 进行排序
            for (int j = 0; j < arr.length -1 -3; j++) {    //-1是因为最后一个数是不需要排序的,-3是从arr[3]的位置开始
                if(arr[j] > arr[j+1]) {                    //如果前1个数大于后一个数,那么就将其进行交换位置
                    temp = arr[j];                        //我们先将前1个数存放到临时变量中
                    arr[j] = arr[j+1];                    //将后1个变量赋值给前1个变量
                    arr[j+1] = temp;                    //再将刚才的临时变量存储的值,赋值给后1个变量
                }
            }
            System.out.println("第4轮排序完成后:"+Arrays.toString(arr));    //[1, 34, 101, 119]
            
        }
    }

     整体实现

    package com.zpb.bubbling;
    
    import java.util.Arrays;
    
    /**
     * @des                                  
     * @author  zhao
     * @date    2019年11月2日下午10:20:15
     * 
     */
    public class BubblingSort2 {
        
        public static void main(String[] args) {
            int arr[] = {3,-1,4,2,5};
            bubblingSort(arr);
        }
        
        public static void bubblingSort(int arr[]) {
            
            int temp = 0;
            for (int i = 0; i < arr.length -1; i++) {
                for (int j = 0; j < arr.length -1 - i; j++) {
                    if(arr[j] > arr[j+1]) {
                        temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;
                    }
                System.out.println("第"+i+"次排序结果是:"+Arrays.toString(arr));
                }
            }
            System.out.println(Arrays.toString(arr));
        }
        
    }

     优化步骤

    package com.zpb.bubbling;
    
    import java.util.Arrays;
    
    /**
     * @des                                  
     * @author  zhao
     * @date    2019年11月2日下午11:53:52
     * 
     */
    public class BubblingSort3 {
        public static void main(String[] args) {
            int arr[] = {101,34,119,1};
            bubblingSort(arr);
        }
        
        public static void bubblingSort(int arr[]) {
            
            int temp = 0;
            boolean flag = false;
            for (int i = 0; i < arr.length -1; i++) {
                for (int j = 0; j < arr.length -1 - i; j++) {
                    if(arr[j] > arr[j+1]) {
                        flag = true;
                        temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;
                    }
                System.out.println("第"+i+"次排序结果是:"+Arrays.toString(arr));
                }
                if(!flag) {      //在一趟排序中,一次交换都没有发生过
                    break;
                }else {
                    flag = false;
                }
            }
        }
    }

     八大算法持续更新中,希望对你有所帮助,敬请关注!!!

  • 相关阅读:
    使用Nodejs+mongodb开发地图瓦片服务器
    深入浅出ghostbuster剖析NodeJS与PhantomJS的通讯机制
    Hibernate查询出现java.lang.IllegalArgumentException异常解决方法
    tilecache2.11在windows apache2.22安装部署
    OpenLayers调用ArcGIS Server发布的WFS服务
    无法启动ArcSDE服务
    AndroidManifest修改重打包全过程
    Java正确转换html编码
    pip 异常问题
    python 从数据库取回来的数据中文显示为乱码
  • 原文地址:https://www.cnblogs.com/MrRightZhao/p/11784884.html
Copyright © 2011-2022 走看看