数据结构与算法单排日记-2020/3/21-排序算法&冒泡排序

冒泡排序(Bubble Sorting)的基本思想:

通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。

在这里插入图片描述

冒泡排序应用实例

我们举一个具体的案例来说明冒泡法。我们将五个无序的数:3, 9, -1, 10, -2 使用冒泡排序法将其排成一个从小到大的有序数列。
在这里插入图片描述

小结冒泡排序规则

(1) 一共进行 数组的大小-1 次 大的循环
(2)每一趟排序的次数在逐渐的减少
(3)如果我们发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。这个就是优化(如第二趟排序(2))

冒泡排序过程代码:
import java.util.Arrays;

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

        //第1趟排序,就是将最大的数排在最后
        int temp = 0;//临时变量
        for (int i = 0; i < arr.length - 1 -0; i++) {
            if (arr[i] > arr[1 + i]) {
                temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
            }
        }
        System.out.println("第1次排序结果:" + Arrays.toString(arr));
        //第2趟排序,就是将第2大的数排在导数第2位
        for (int i = 0; i < arr.length - 1 -1; i++) {
            if (arr[i] > arr[1 + i]) {
                temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
            }
        }
        System.out.println("第2次排序结果:" + Arrays.toString(arr));


        //第3趟排序,就是将第3大的数排在导数第3位
        for (int i = 0; i < arr.length -1 -1 -1; i++) {
            if (arr[i] > arr[1 + i]) {
                temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
            }
        }
        System.out.println("第3次排序结果:" + Arrays.toString(arr));

        //第4趟排序,就是将第3大的数排在导数第4位
        for (int i = 0; i < arr.length -1 -1 -1 -1; i++) {
            if (arr[i] > arr[1 + i]) {
                temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
            }
        }
        System.out.println("第4次排序结果:" + Arrays.toString(arr));

        //一共进行数组的大小-1 次 =5-1=4次循环
    }
}

在这里插入图片描述

冒泡排序代码(循环):
import java.util.Arrays;

public class BubbleSort02 {
    public static void main(String[] args) {
        int[] arr = {3, 9, -1, 10, -2};
        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 + 1) + "次排序");
            System.out.println(Arrays.toString(arr));
        }
    }
}

在这里插入图片描述

时间复杂度O(N^2)

冒泡排序优化

如果我们发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。

import java.util.Arrays;

public class BubbleSort02 {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        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]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = true;
                }
            }
            if (flag=false){//如果小循环一次没发生交换,则退出整个大循环
                break;
            }else {
                flag=false;//如果发生交换,则需要重置flag
            }
            System.out.println("第" + (i + 1) + "次排序");
            System.out.println(Arrays.toString(arr));
        }
    }
}

  • 转换成方法的方式,以及程序运行时间检测:
import java.util.Arrays;

public class BubbleSort03 {
    public static void main(String[] args) {
        int[] arr = new int[8000];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 80000);
        }

        long startTime = System.currentTimeMillis(); //获取开始时间doSomething(); //测试的代码段
        bubbleSort(arr);
        long endTime = System.currentTimeMillis(); //获取结束时间
        System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间

    }

    public static void bubbleSort(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]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = true;
                }
            }
            if (flag == false) {//如果小循环一次没发生交换,则退出整个大循环
                break;
            } else {
                flag = false;//如果发生交换,则需要重置flag
            }
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值