2011年,C語言老師給咱們講冒泡排序。面試
2014年,聽同窗提及他面試時和麪試官提起冒泡排序。算法
2015年,大學本科剛畢業,開始找工做,我還記得我在筆記中寫了冒泡排序的代碼,結果還真的被問到了。架構
2019年,公司首席架構師跟我提到冒泡排序。spa
什麼是冒泡排序呢?3d
冒泡排序,Bubble Sort,經過依次來比較相鄰兩個元素的大小,在每一次的比較的過程當中,兩個元素,經過交換來達到有序的目的。code
就像碳酸飲料中的氣泡同樣,從底部一直冒泡到頂部。blog
我想經過一組數據來闡述冒泡排序的過程。排序
最後咱們使用Java代碼來展現上述的算法。ast
1 private static void sort() { 2 3 Integer[] data = {6,3,2,1,8,9,7,5}; 4 5 for(int i=0; i<data.length-1; i++) { 6 7 for(int j=0; j<data.length-i-1; j++) { 8 9 if(data[j] > data[j+1]) { 10 int k = data[j]; 11 data[j] = data[j+1]; 12 data[j+1] = k; 13 } 14 15 } 16 } 17 18 }
從上述的代碼以及流程圖中。大體的步驟以下:class
從以上的現象來看,咱們得出結論和思考:
1 private static void sort() { 2 3 Integer[] data = {6,3,2,1,8,9,7,5}; 4 5 for(int i=0; i<data.length-1; i++) { 6 7 boolean isSorted = true; 8 9 for(int j=0; j<data.length-i-1; j++) { 10 11 if(data[j] > data[j+1]) { 12 int k = data[j]; 13 data[j] = data[j+1]; 14 data[j+1] = k; 15 16 isSorted = false; 17 } 18 } 19 20 if(isSorted) { 21 break; 22 } 23 } 24 25 }
從上述的代碼和流程圖中,若是在第一層的循環中第二次始終沒有元素交換,代表數列已經有序,直接輸出。
1 private static void sort() { 2 3 Integer[] data = {6,3,2,1,8,9,7,5}; 4 5 //最後交換的元素的下標 6 int lastIndexOfSwap = 0; 7 //無序數列邊界元素的下標 8 int borderIndexOfUnsort = data.length - 1; 9 10 for(int i=0; i<data.length-1; i++) { 11 12 boolean isSorted = true; 13 14 for(int j=0; j<borderIndexOfUnsort; j++) { 15 16 if(data[j] > data[j+1]) { 17 int k = data[j]; 18 data[j] = data[j+1]; 19 data[j+1] = k; 20 21 isSorted = false; 22 23 lastIndexOfSwap = j; 24 } 25 } 26 27 borderIndexOfUnsort = lastIndexOfSwap; 28 29 if(isSorted) { 30 break; 31 } 32 33 } 34 35 }
冒泡排序是最簡單的一種排序算法,3個版本演進,也許並無提升多大的效能,更多應該是對於算法的思惟。