我是野豬。
排序: 將雜亂無章的數據元素,通過一定的方法按關鍵字順序排列的過程叫做排序。對數據進行排序有可能是檢索的一個初始步驟。二分查找比線性查找要快的多,然而它只能應用於有序的數據。其次排序非常重要也可能非常耗時。
冒泡排序、選擇排序和插入排序都是簡單排序,算法時間複雜度都是O(n^2)。
冒泡排序是在各大教科書排序篇章中牢牢佔據首位,我一直想這是爲啥,是因爲它效率高?那肯定不能夠,衆所周知冒泡排序是效率最低的;那就是它最簡單,至少是在代碼上相當的簡單,對於初學者來說,寫一個冒泡排序寫對的概率其實要比其他O(n^2)的算法高不少。還有一個答案可能就是只是爲了學習怎麼用for循環,但這個簡單的for循環卻能讓大家意識到,看似複雜的數據可以通過簡單的交換來實現。
冒泡排序的原理:冒泡的意思就是一次循環把最大值交換到末尾,顯然第一次比較的次數最多是N,第二次比較次數最多是N-1次, 一直到最後比較一次,所以總共的次數是1+....+N-1= (1 + N-1)(N-1) /2 = N(N-1)/2,因此時間複雜度爲O(n^2);
java代碼:
/**
* 冒泡排序
* 優點:穩定
* 缺點:慢 時間複雜度是O(N2) 自己算下就可以理解
* 時間複雜度分析:冒泡的意思就是一次循環把最大值交換到末尾,顯然第一次比較的次數最多是N,第二次比較次數最多是N-1次,
* 一直到最後比較一次,所以總共的次數是1+....+N-1= (1 + N-1)(N-1) /2 = N(N-1)/2; 因此時間複雜度爲O(N 2);
*/
public class BubbleSort {
public static void main(String[] args) {
int sore[] = {3, 7, 2};
//從小到大
bubleSortByAsc(sore);
}
private static void bubleSortByAsc(int[] sore) {
//冒泡排序 明確下標的範圍 從小到大排序
for (int i = 0; i < sore.length; i++) {
for (int j = 0; j < sore.length - i - 1; j++) {
if (sore[j] > sore[j + 1]) {
int temp = sore[j];
sore[j] = sore[j + 1];
sore[j + 1] = temp;
}
System.out.print("第" + i + "趟," + "第" + j + "次結果:");
print(sore);
System.out.println("\t");
}
}
System.out.println("冒泡排序後:");
for (int i = 0; i < sore.length; i++) {
System.out.println(sore[i] + "\t");
}
}
private static void print(int[] sore) {
for (int i = 0; i < sore.length; i++) {
System.out.print(sore[i] + "\t");
}
}
}
輸出結果:
冒泡排序相對簡單,多敲幾遍就能理解的很透徹。