冒泡排序.

基本介绍

冒泡排序(Bubble Sorting)的基本思想:通过对待排序序列从前向后(从下标较小的元素开始,依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒.
因为排序过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行交换,说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换,从而减少不必要的比较,(这里说的是优化,之后在基本的学完之后再说)

冒泡排序引用实例

冒泡排序算法的一个过程.(对数组进行排序,原始数组:3,9,-1,10,20)
第一趟排序:

  • (1):3,9,-1,10,-2 (如果相邻的两个原始逆序就交换,此时3与9没有逆序)
  • (2):3,-1,9,10,-2 (此时比较9,与-1,他们逆序)
  • (3):3,-1,9,10,-2 (此时比较9和10,没有逆序,不用交互)
  • (4):3,-1,9,-2,10.(第一趟排序我们找到了最大的数)
    第二趟排序
  • (1):-1,3,9,-2,10
  • (2):-1,3,9,-2,10
  • (3):-1,3,-2,9,10(第二个最大的数确定下来)
    第三趟排序
  • (1):-1,3,-2,9,20
  • (2):-1,-2,3,9,10
    第四趟排序
  • (1)::-1,-2,3,9,10
  • (2):-2,-1,3,9,10
    小结冒泡排序
    1.一共要进行数组的大小-1次大的循环
    2.每一趟排序的次数在逐渐的减少.
    3,如果我们发现在某趟排序中,没有发生一次交换,可以提交接受冒泡排序.(这样可以对冒泡进行优化)
    例子
    第一趟排序:
  • (1):3,9,-1,10,20 (如果相邻的两个原始逆序就交换,此时3与9没有逆序)
  • (2):3,-1,9,10,20 (此时比较9,与-1,他们逆序)
  • (3):3,-1,9,10,20 (此时比较9和10,没有逆序,不用交互)
  • (4):3,-1,9,10,20.(第一趟排序我们找到了最大的数)
    第二趟排序(这一趟排序我们就开始没有进行交换,那么我们可以选择提前退出.)
  • (1):-1,3,9,10,20
  • (2):-1,3,9,10,20
  • (3):-1,3,9,10,20(第二个最大的数确定下来)
    第三趟排序
  • (1):-1,3,9,10,20
  • (2):-1,3,9,10,20
    第四趟排序
  • (1)::-1,3,9,10,20
  • (2):-1,3,9,10,20

代码实现

我们演示一下这个过程(用代码)

package sort;

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {3, 9, -1, 10, -2};

        //为了容易理解我们把冒泡排序的演变过程进行展示
        /**
         * 第一趟排序就是将最大的那个数,排到最后.
         */
        int temp = 0;//临时变量
        for (int j = 0; j < arr.length - 1; j++) {
            //如果前面的数比后面的数大则交换
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }

        System.out.println("第一趟排序后的数组:" + Arrays.toString(arr));


        /**
         * 第二趟排序就是将最大的那个数,排到最后.
         */
        for (int j = 0; j < arr.length - 2; j++) {
            //如果前面的数比后面的数大则交换
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }

        System.out.println("第二趟排序后的数组:" + Arrays.toString(arr));




        /**
         * 第三趟排序就是将最大的那个数,排到最后.
         */
        for (int j = 0; j < arr.length - 3; j++) {
            //如果前面的数比后面的数大则交换
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }

        System.out.println("第四趟排序后的数组:" + Arrays.toString(arr));

        /**
         * 第三趟排序就是将最大的那个数,排到最后.
         */
        for (int j = 0; j < arr.length - 3; j++) {
            //如果前面的数比后面的数大则交换
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }

        System.out.println("第四趟排序后的数组:" + Arrays.toString(arr));

    }
}

BubbleSort
package sort;

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {3, 9, -1, 10, -2};
       //这里两个循环,可以看出冒泡排序的时间复杂度.O(n^2)
        int temp = 0;//临时变量
        for(int i=0;i<arr.length-1;i++){
        for (int j = 0; j < arr.length - i; j++) {
            //如果前面的数比后面的数大则交换
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
            System.out.println("第("+(i+1)+")趟排序:"+ Arrays.toString(arr));
        }
          System.out.println("最后得到的结果:"+ Arrays.toString(arr));
}}
冒泡排序的优化
package sort;

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {-1,3, 9, 10, 20};
        int temp = 0;//临时变量
        boolean flag=false;//标识变量(表示是否进行过交换)
        for(int i=0;i<arr.length-1;i++){
        for (int j = 0; j < arr.length - i; j++) {
            //如果前面的数比后面的数大则交换
            if (arr[j] > arr[j + 1]) {
                flag=true;//如果flag进来过这个循环,那么就一定进行过交换
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
            System.out.println("第("+(i+1)+")趟排序:"+ Arrays.toString(arr));
         if(!flag){//在这一趟排序中,一次交换都没有发生过
             break;
         }else {
             flag=false;//将flag重置,不重置的话会没有用的flag
         }
        }
            System.out.println("最后得到的结果:"+ Arrays.toString(arr));
        }}
封装成一个方法,进行调用
package sort;

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {-1, 3, 9, 10, -2};
        int[] arr1={-1, 3, 9, 10, 20};
         BubbleSorts(arr);
         BubbleSorts(arr1);
    }

//将前面的冒泡排序封装成一个方法
        public static void BubbleSorts ( int[] arr){     
            int temp = 0;//临时变量
            boolean flag = false;//标识变量(表示是否进行过交换)
            for (int i = 0; i < arr.length - 1; i++) {
                for (int j = 0; j < arr.length - i; j++) {
                    //如果前面的数比后面的数大则交换
                    if (arr[j] > arr[j + 1]) {
                        flag = true;//如果flag进来过这个循环,那么就一定进行过交换
                        temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
                System.out.println("第(" + (i + 1) + ")趟排序:" + Arrays.toString(arr));
                if (!flag) {//在这一趟排序中,一次交换都没有发生过
                    break;
                } else {
                    flag = false;//将flag重置,不重置的话会没有用的flag
                }
            }
   System.out.println("最后得到的结果:"+ Arrays.toString(arr));
            }}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Galaxy@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值