十大排序算法之一:冒泡排序

漫画:什么是冒泡排序?

1 原始的实现

1.1 原理

在这里插入图片描述

1.2 实现

import java.util.Arrays;

/**
 * 冒泡排序
 *
 * @author wgm
 * @since 2021/4/18
 */
public class BubbleSort {

    public static void main(String[] args) {
        int[] ints = {-3, -2, -1, 5, 8, 6, 3, 9, 2, 1, 7, 11, 12, 13};
        System.out.println("排序前:\t" + Arrays.toString(ints));
        System.out.println("排序后:\t" + Arrays.toString(bubbleSort(ints)));
    }

    private static int[] bubbleSort(int[] ints) {
        if (ints == null || ints.length <=1 ) {
            return ints;
        }
        for (int i = ints.length - 1; i >= 1; i--) {
            for (int j = 0; j < i; j++) {
                if (ints[j] > ints[j + 1]) {
                    swap(ints, j, j + 1);
                }
            }
            System.out.println("\t\t" + Arrays.toString(ints));
        }
        return ints;
    }

    private static void swap(int[] ints, int index1, int index2) {
        int temp = ints[index1];
        ints[index1] = ints[index2];
        ints[index2] = temp;
    }
}

1.3 测试

D:\program\Java\jdk1.8.0_241\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:54668,suspend=y,server=n "-javaagent:C:\Users\GMWANG~1\AppData\Local\Temp\captureAgent249jars\debugger-agent.jar" -Dfile.encoding=UTF-8 -classpath "D:\program\Java\jdk1.8.0_241\jre\lib\charsets.jar;D:\program\Java\jdk1.8.0_241\jre\lib\deploy.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\access-bridge-64.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\cldrdata.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\dnsns.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\jaccess.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\jfxrt.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\localedata.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\nashorn.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunec.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunjce_provider.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunmscapi.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunpkcs11.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\zipfs.jar;D:\program\Java\jdk1.8.0_241\jre\lib\javaws.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jce.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jfr.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jfxswt.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jsse.jar;D:\program\Java\jdk1.8.0_241\jre\lib\management-agent.jar;D:\program\Java\jdk1.8.0_241\jre\lib\plugin.jar;D:\program\Java\jdk1.8.0_241\jre\lib\resources.jar;D:\program\Java\jdk1.8.0_241\jre\lib\rt.jar;D:\project\untitled\out\production\untitled;D:\program\JetBrains\IntelliJ IDEA 2020.1\lib\idea_rt.jar" BubbleSort
Connected to the target VM, address: '127.0.0.1:54668', transport: 'socket'
排序前:	[-3, -2, -1, 5, 8, 6, 3, 9, 2, 1, 7, 11, 12, 13]
		[-3, -2, -1, 5, 6, 3, 8, 2, 1, 7, 9, 11, 12, 13]
		[-3, -2, -1, 5, 3, 6, 2, 1, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 3, 5, 2, 1, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 3, 2, 1, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 2, 1, 3, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
排序后:	[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
Disconnected from the target VM, address: '127.0.0.1:54668', transport: 'socket'

Process finished with exit code 0

2 优化后的实现

2.1 原理

左边或右边存在有序区时,通过优化减少遍历次数。

2.2 实现

import java.util.Arrays;

/**
 * 冒泡排序
 *
 * 优化:
 * 左边或右边存在有序区时,通过优化减少遍历次数。
 *
 * @author wgm
 * @since 2021/4/18
 */
public class BubbleSort {

    public static void main(String[] args) {
        int[] ints = {-3, -2, -1, 5, 8, 6, 3, 9, 2, 1, 7, 11, 12, 13};
        System.out.println("排序前:\t" + Arrays.toString(ints));
        System.out.println("排序后:\t" + Arrays.toString(bubbleSort(ints)));
    }

    private static int[] bubbleSort(int[] ints) {
        if (ints == null || ints.length <= 1) {
            return ints;
        }

        boolean sorted = true; // 是否已经有序。左边存在有序区时的优化。
        for (int i = ints.length - 1; i >= 1; i--) {
            int right = i; // 遍历的右边界。右边存在有序区时的优化。
            for (int j = 0; j < i; j++) {
                if (ints[j] > ints[j + 1]) {
                    swap(ints, j, j + 1);
                    sorted = false;
                    right = j + 1;
                }
            }
            if (sorted) {
                break;
            }
            i = right;
            System.out.println("\t\t" + Arrays.toString(ints));
        }

        return ints;
    }

    private static void swap(int[] ints, int index1, int index2) {
        int temp = ints[index1];
        ints[index1] = ints[index2];
        ints[index2] = temp;
    }
}

2.3 测试

D:\program\Java\jdk1.8.0_241\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:54504,suspend=y,server=n "-javaagent:C:\Users\GMWANG~1\AppData\Local\Temp\captureAgent1100jars\debugger-agent.jar" -Dfile.encoding=UTF-8 -classpath "D:\program\Java\jdk1.8.0_241\jre\lib\charsets.jar;D:\program\Java\jdk1.8.0_241\jre\lib\deploy.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\access-bridge-64.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\cldrdata.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\dnsns.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\jaccess.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\jfxrt.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\localedata.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\nashorn.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunec.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunjce_provider.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunmscapi.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunpkcs11.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\zipfs.jar;D:\program\Java\jdk1.8.0_241\jre\lib\javaws.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jce.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jfr.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jfxswt.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jsse.jar;D:\program\Java\jdk1.8.0_241\jre\lib\management-agent.jar;D:\program\Java\jdk1.8.0_241\jre\lib\plugin.jar;D:\program\Java\jdk1.8.0_241\jre\lib\resources.jar;D:\program\Java\jdk1.8.0_241\jre\lib\rt.jar;D:\project\untitled\out\production\untitled;D:\program\JetBrains\IntelliJ IDEA 2020.1\lib\idea_rt.jar" BubbleSort
Connected to the target VM, address: '127.0.0.1:54504', transport: 'socket'
排序前:	[-3, -2, -1, 5, 8, 6, 3, 9, 2, 1, 7, 11, 12, 13]
		[-3, -2, -1, 5, 6, 3, 8, 2, 1, 7, 9, 11, 12, 13]
		[-3, -2, -1, 5, 3, 6, 2, 1, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 3, 5, 2, 1, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 3, 2, 1, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 2, 1, 3, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
		[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
排序后:	[-3, -2, -1, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13]
Disconnected from the target VM, address: '127.0.0.1:54504', transport: 'socket'

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值