冒泡算法--通俗易通

一.冒泡算法介绍

  定义:

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

  冒泡算法分为2种:
    1.一种是利用内、外循环的脚标来确定二个数,进行比较。
    2.另一种是利用内存循环的脚标、内循环脚标+1来确定2个数,来进行比较

 

二.代码实现

  1.分步实现

  2.整体实现

  3.优化步骤

  分步实现过程

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;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/MrRightZhao/p/11784884.html

时间: 2024-11-10 19:22:46

冒泡算法--通俗易通的相关文章

KMP算法--通俗易通

public class KMPAlgorithm { public static void main(String[] args) { String str1 = "BBC ABCDAB ABCDABCDABDE"; String str2 = "ABCDABD"; int[] kmpTable = kmpTable(str2); System.out.println(Arrays.toString(kmpTable)); } public static int[

2019最新设计模式(最通俗易通)

课程目录:0-设计模式前言Singleton-单例模式-第一模式1-strategy_策略模式-第二模式2-strategy_策略模式-第二模式3-strategy_策略模式-第二模式4-strategy_策略模式-第二模式5-strategy_策略模式-第二模式6-Factory_1-第三第四模式7-Factory_2-第三第四模式8-Factory_3-第三第四模式9-门面与调停者-第五模式-第六模式10-门面与调停者_2-第五模式-第六模式11-Decorator_装饰器-第七模式12-详

Fleury (弗罗莱) 算法通俗解释

Fleury (弗罗莱) 算法通俗解释 1.定义 2.举例说明 图2为连通图G,现利用Fleury算法求它的欧拉通路.(注意区分:欧拉通路.欧拉回路) 其中一种欧拉通路如下:4 5 8 7 6 8 9 1 5 3 2 4 6,其搜索路径如下图所示: 现在让我们来分析算法实现过程: 假设我们这样走:4,6,8,5,此时在5处有三种选择(3,4,1),那么哪种能走通哪种走不通呢?答案是(3,4)通,1不通.为什么呢?来看下图- 分析: 因为(5~1)之间的边是除去已走过边(E(G)-{E1(4~6)

1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)

1014 C语言文法定义与C程序的推导过程  程序:冒泡算法C程序(语法树)1 阅读并理解提供给大家的C语言文法文件. 2 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 3 给出一段C程序,画出用上述文法产生这段C程序的完整语法树. 程序:冒泡算法C程序 点此文字查看原图(完整图片) 1 #include <stdio.h> 2 3 main() 4 { 5 int i,j,temp; 6 int a[10]; 7 8 for(i=0;i<10;i++) 9 scanf

Python函数之冒泡算法

冒泡算法 1. data = [4,3,2,1] count = 0 for i in range(0, len(data)): #len(data)代表的是列表的总长度 #取外层函数的第一个值进行循环 for j in range(i + 1, len(data)): #把外层循环的第一个值跟所有的内层循环的值比较一遍,并跟换位置,沉低 count += 1 if data[j] < data[i]: tmp = data[j] data[j] = data[i] data[i] = tmp

阶乘求和与冒泡算法编程

编程题是写1!+2!+...+10!: 冒泡算法编程

python冒泡算法,lambda表达式

======================================================================== 冒泡算法 (个人理解类似于IP互换方案方式,或者被老师成为小鱼冒泡泡) 如何将列表内的数字进行排序呢? 方法1(需要递归) li =[5,4,3,2,6]                 #定义一个列表 print li                            #调试打印出列表 for m in range(4):          #通

关于冒泡算法

首先冒泡算法就是每次把最大的找出来,冒泡出去,但是有2种不同实现. 第一: public class Test12{     public static void main(String[] args){/*         int score[] = {67, 88, 45, 87, 29, 99, 109, 100};         for (int i = 0; i < score.length -1; i++){    //最多做n-1趟排序             for(int j

Python 第五篇:冒泡算法、系统标准模块

一:冒泡算法,也叫冒泡排序,其特点如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.针对所有的元素重复以上的步骤,除了最后一个. 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 使用python的冒泡排序完成一组无序队列的排序: data = [10,4,33,21,54,3,8,11,5,22,2,2,2,1,17,13,6] print(d