冒泡排序作爲十大排序之一,是一種簡單且穩定的排序算法
算法思想可以聯想爲向湖中下石頭和較輕的石頭變成泡泡上浮的過程
想象每一塊石頭處在相應的高度,從上往下相鄰兩個石頭進行比較,較大的石頭往下沉,替代下一石頭的位置
較輕的石頭像泡泡一樣往上浮一個單位,直到這一輪最重的石頭沉到湖底,此趟比較才結束
此時,最重的石頭已經再湖底,不需要再參加下一趟排序,可以想象爲以及與湖底融爲一體了
可以得到,每次排序都會將最重的石頭往下沉並和湖底融爲一體
因此,排序至多需要 n-1 趟(最後一趟只剩一個元素,因此不會再排序),最少需要1趟(已經有序)
算法思想:雙重for循環,外層循環控制每次排序元素的長度(被排序的元素個數依次遞減),內層循環遍歷每輪循環的元素
適用場景:數據量小、有序或者部分有序的數列
時間複雜度:O(n^2) 空間複雜度:O(1)
代碼實現:(未優化版)
package com.gxwz.vo;
import java.util.Arrays;
/**
* Java十大排序之冒泡排序(未優化版)
* @author com
*
*/
public class Sorts {
public static void main(String[] args) {
int[] arr = {49,26,2,9,16,0,10,100,24};
System.out.println(Arrays.toString(insertSort(arr)));
}
public static int[] insertSort(int[] A) {
int length = A.length;
int temp = 0;
for(int i=length-1;i>0;i--) {
for(int j=0;j<i;j++) {
if(A[j]>A[j+1]) {
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
}
}
return A;
}
}
運行結果:
[0, 2, 9, 10, 16, 24, 26, 49, 100]
原數據:
[49, 26, 2, 9, 16, 0, 10, 100, 24]
第 1 趟排序:
[26, 49, 2, 9, 16, 0, 10, 100, 24]
[26, 2, 49, 9, 16, 0, 10, 100, 24]
[26, 2, 9, 49, 16, 0, 10, 100, 24]
[26, 2, 9, 16, 49, 0, 10, 100, 24]
[26, 2, 9, 16, 0, 49, 10, 100, 24]
[26, 2, 9, 16, 0, 10, 49, 100, 24]
[26, 2, 9, 16, 0, 10, 49, 100, 24]
[26, 2, 9, 16, 0, 10, 49, 24, 100]
第 2 趟排序:
[2, 26, 9, 16, 0, 10, 49, 24, 100]
[2, 9, 26, 16, 0, 10, 49, 24, 100]
[2, 9, 16, 26, 0, 10, 49, 24, 100]
[2, 9, 16, 0, 26, 10, 49, 24, 100]
[2, 9, 16, 0, 10, 26, 49, 24, 100]
[2, 9, 16, 0, 10, 26, 49, 24, 100]
[2, 9, 16, 0, 10, 26, 24, 49, 100]
第 3 趟排序:
[2, 9, 16, 0, 10, 26, 24, 49, 100]
[2, 9, 16, 0, 10, 26, 24, 49, 100]
[2, 9, 0, 16, 10, 26, 24, 49, 100]
[2, 9, 0, 10, 16, 26, 24, 49, 100]
[2, 9, 0, 10, 16, 26, 24, 49, 100]
[2, 9, 0, 10, 16, 24, 26, 49, 100]
第 4 趟排序:
[2, 9, 0, 10, 16, 24, 26, 49, 100]
[2, 0, 9, 10, 16, 24, 26, 49, 100]
[2, 0, 9, 10, 16, 24, 26, 49, 100]
[2, 0, 9, 10, 16, 24, 26, 49, 100]
[2, 0, 9, 10, 16, 24, 26, 49, 100]
第 5 趟排序:
[0, 2, 9, 10, 16, 24, 26, 49, 100]
[0, 2, 9, 10, 16, 24, 26, 49, 100]
[0, 2, 9, 10, 16, 24, 26, 49, 100]
[0, 2, 9, 10, 16, 24, 26, 49, 100]
第 6 趟排序:
[0, 2, 9, 10, 16, 24, 26, 49, 100]
[0, 2, 9, 10, 16, 24, 26, 49, 100]
[0, 2, 9, 10, 16, 24, 26, 49, 100]
第 7 趟排序:
[0, 2, 9, 10, 16, 24, 26, 49, 100]
[0, 2, 9, 10, 16, 24, 26, 49, 100]
第 8 趟排序:
[0, 2, 9, 10, 16, 24, 26, 49, 100]
[0, 2, 9, 10, 16, 24, 26, 49, 100]
優化版:
import java.util.Arrays;
/**
* Java十大排序之冒泡排序(優化版)
* @author com
*
*/
public class Sorts {
public static void main(String[] args) {
int[] arr = {49,26,2,9,16,0,10,100,24};
System.out.println(Arrays.toString(insertSort(arr)));
}
public static int[] insertSort(int[] A) {
int length = A.length;
int temp = 0;
boolean flag;
for(int i=length-1;i>0;i--) {
flag = true;
for(int j=0;j<i;j++) {
if(A[j]>A[j+1]) {
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
flag = false;
}
}
if(flag) break;
}
return A;
}
}
優化思路:
在每次循環前設置一個flag,如果此趟排序有元素交換則爲false,否則爲true。
在每次交換代碼執行之後再判斷flag的狀態,如果false則繼續執行,否則結束循環。
優點:如果元素在n-1趟排序之前已經排好序,後面的循環不需要再繼續了。
運行結果:
[0, 2, 9, 10, 16, 24, 26, 49, 100]
原數據:
[49, 26, 2, 9, 16, 0, 10, 100, 24]
第 1 趟排序:
[26, 49, 2, 9, 16, 0, 10, 100, 24]
[26, 2, 49, 9, 16, 0, 10, 100, 24]
[26, 2, 9, 49, 16, 0, 10, 100, 24]
[26, 2, 9, 16, 49, 0, 10, 100, 24]
[26, 2, 9, 16, 0, 49, 10, 100, 24]
[26, 2, 9, 16, 0, 10, 49, 100, 24]
[26, 2, 9, 16, 0, 10, 49, 100, 24]
[26, 2, 9, 16, 0, 10, 49, 24, 100]
第 2 趟排序:
[2, 26, 9, 16, 0, 10, 49, 24, 100]
[2, 9, 26, 16, 0, 10, 49, 24, 100]
[2, 9, 16, 26, 0, 10, 49, 24, 100]
[2, 9, 16, 0, 26, 10, 49, 24, 100]
[2, 9, 16, 0, 10, 26, 49, 24, 100]
[2, 9, 16, 0, 10, 26, 49, 24, 100]
[2, 9, 16, 0, 10, 26, 24, 49, 100]
第 3 趟排序:
[2, 9, 16, 0, 10, 26, 24, 49, 100]
[2, 9, 16, 0, 10, 26, 24, 49, 100]
[2, 9, 0, 16, 10, 26, 24, 49, 100]
[2, 9, 0, 10, 16, 26, 24, 49, 100]
[2, 9, 0, 10, 16, 26, 24, 49, 100]
[2, 9, 0, 10, 16, 24, 26, 49, 100]
第 4 趟排序:
[2, 9, 0, 10, 16, 24, 26, 49, 100]
[2, 0, 9, 10, 16, 24, 26, 49, 100]
[2, 0, 9, 10, 16, 24, 26, 49, 100]
[2, 0, 9, 10, 16, 24, 26, 49, 100]
[2, 0, 9, 10, 16, 24, 26, 49, 100]
第 5 趟排序:
[0, 2, 9, 10, 16, 24, 26, 49, 100]
[0, 2, 9, 10, 16, 24, 26, 49, 100]
[0, 2, 9, 10, 16, 24, 26, 49, 100]
[0, 2, 9, 10, 16, 24, 26, 49, 100]