它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名“冒泡排序”。
(上面是百度出来的,我自己做一个简单的解释:相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处)
算法原理
冒泡排序算法的运作如下:(从后往前)
(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
(3)针对所有的元素重复以上的步骤,除了最后一个。
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码实现:
public class BubbleSort {
public static void main(String[] args) {
// 定义一个数组
int[] arr = { 24, 69, 80, 57, 13 };
System.out.println("排序前:");
printArray(arr);
firstSort(arr);
secondSort(arr);
thirdSort(arr);
fourthSort(arr);
bubbleSort(arr);
bestBubbleSort(arr);
}
// 遍历功能
public static void printArray(int[] arr) {
System.out.print("[");
for (int x = 0; x < arr.length; x++) {
if (x == arr.length - 1) {
System.out.print(arr[x]);
} else {
System.out.print(arr[x] + ", ");
}
}
System.out.println("]");
}
// 第一次比较
public static void firstSort(int[] arr) {
for (int x = 0; x < arr.length - 1 - 0; x++) {
if (arr[x] > arr[x + 1]) {
int temp = arr[x];
arr[x] = arr[x + 1];
arr[x + 1] = temp;
}
}
System.out.println("第一次比较后:");
printArray(arr);
}
// 第二次比较
public static void secondSort(int[] arr) {
for (int x = 0; x < arr.length - 1 - 1; x++) {
if (arr[x] > arr[x + 1]) {
int temp = arr[x];
arr[x] = arr[x + 1];
arr[x + 1] = temp;
}
}
System.out.println("第二次比较后:");
printArray(arr);
}
// 第三次比较
public static void thirdSort(int[] arr) {
for (int x = 0; x < arr.length - 1 - 2; x++) {
if (arr[x] > arr[x + 1]) {
int temp = arr[x];
arr[x] = arr[x + 1];
arr[x + 1] = temp;
}
}
System.out.println("第三次比较后:");
printArray(arr);
}
// 第四次比较
public static void fourthSort(int[] arr) {
for (int x = 0; x < arr.length - 1 - 3; x++) {
if (arr[x] > arr[x + 1]) {
int temp = arr[x];
arr[x] = arr[x + 1];
arr[x + 1] = temp;
}
}
System.out.println("第四次比较后:");
printArray(arr);
}
// 推算出冒泡排序算法
public static void bubbleSort(int[] arr) {
long cStart = System.nanoTime();
for (int x = 0; x < arr.length - 1; x++) {
for (int y = 0; y < arr.length - 1 - x; y++) {
if (arr[y] > arr[y + 1]) {
int temp = arr[y];
arr[y] = arr[y + 1];
arr[y + 1] = temp;
}
}
}
long cEnd = System.nanoTime();
System.out.println("整合版所用时间:" + (cEnd - cStart));
printArray(arr);
}
// 优化版
public static void bestBubbleSort(int[] arr) {
long cStart = System.nanoTime();
for (int i = 0; i < arr.length - 1; i++) {
boolean flag = true;// 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已然完成。
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = false;
}
}
// 一旦数组已经是有序的,立马跳出for循环,就不需要再浪费时间比较了
if (flag) {
break;
}
}
long cEnd = System.nanoTime();
System.out.println("优化版所用时间:" + (cEnd - cStart));
printArray(arr);
}
}
打印的结果:
通过代码以及结果可以再简单的进行比较明了的总结:
(1)两两比较,大的往后放
(2)每一次比较完后,下一次比较的时候就会减少一个元素的比较
(3)第一次比较,有0个元素不比
第二次比较,有1个元素不比
第三次比较,有2个元素不比
......
(4)总共需要比较数组长度-1次
冒泡排序优化的原理: 一旦数组有序,跳出循环停止继续比较。