標籤:
冒泡排序即每次遍曆。相鄰數字間進行比較,前者大於後者進行交換,不斷將最大值後移,直至沉至最後位置;演算法關鍵要點在於確定每次迴圈的邊界;
後面兩種演算法則是對冒泡排序一定程度上的改良,但相對於其他排序演算法,冒泡排序效能依然較差。
//冒泡排序public class Bubble_Sort {//最原始的解法public void bubble_sort1(int[] data){int n = data.length;for(int i = 0; i < n; i++){//注意迴圈的index範圍,避免溢出for(int j = 0; j < n - i - 1; j++){if(data[j] > data[j + 1]){swap(data, j , j + 1);}}}}//改進演算法,通過引入一個標誌量flag,判斷一次迴圈是否有移動,若無移動,則表示//排序已經完成,無需在進行下一次繼續迴圈public void bubble_sort2(int[] data){int n = data.length;boolean flag = true;//標示是否進行了移動int index = n - 1; //標示需要迴圈的最後一位的index //一旦在移動,則繼續迴圈while(flag){flag = false;for(int j = 0; j < index - 1; j++){if(data[j] > data[j + 1]){swap(data, j , j + 1);flag = true;}}index--;}}//改進演算法二:當一次遍曆中,最後m位都未進行轉換,則表示後面n位都比當前這個最大數要大//根據冒泡排序知,每次沉入最大值,則後面這些位一定已經排好序public void bubble_sort3(int[] data){int n = data.length;int index = n - 1;while(index != 0){int k = 0;for(int j = 0; j < index - 1; j++){if(data[j] > data[j + 1]){swap(data, j , j + 1);k = j;}}index = k;}}//無法像C++一樣使用引用實現,故只好使用data數組進行改變private void swap(int[] data , int a, int b){int temp = data[a];data[a] = data[b];data[b] = temp;}public void print_array(int[] data){for(int num : data){System.out.print(num);System.out.print(" ");}}public static void main(String[] args) {Bubble_Sort bubble_Sort = new Bubble_Sort();int data[] = {2,34,45,2,13,24,5,24,57};bubble_Sort.bubble_sort3(data);bubble_Sort.print_array(data);}}
排序演算法之冒泡排序(Java)