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