排序演算法總結之氣泡排序
阿新 • • 發佈:2019-02-11
氣泡排序(Bubble Sort,臺灣譯為:泡沫排序或氣泡排序)是一種簡單的排序演算法。它的基本思想就是兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。
例如:初始序列3,6,4,2,11,10,5;從頭開始,兩兩相比,若a[i]>a[i+1],則將兩者交換;
從上面的排序過程來看,其實在第2趟結束後,資料序列就已經是有序的了,因此可以提前結束迴圈,從而避免3~6趟的不必要的比較。
Java實現:
排序效果:package com.liuhao.sort; import java.util.Arrays; public class BubbleSort { public static void bubbleSort(DataWrap[] data) { System.out.println("開始排序"); int arrayLength = data.length; for (int i = 0; i < arrayLength - 1; i++) { boolean flag = false; //記錄某趟是否發生元素交換 for (int j = 0; j < arrayLength - 1 - i; j++) { // 處的元素值大於j+1處的,j處data要往後沉 if(data[j].compareTo(data[j+1]) > 0){ DataWrap tmp = data[j]; data[j] = data[j+1]; data[j+1] = tmp; flag = true; } } System.out.println(Arrays.toString(data)); //如果某趟沒有發生交換,說明序列已經有序,就不需要進行之後的比較了 if(!flag){ break; } } } public static void main(String[] args) { DataWrap[] data = { new DataWrap(21, "") ,new DataWrap(30, "") ,new DataWrap(49, "") ,new DataWrap(30, "*") ,new DataWrap(16, "") ,new DataWrap(9, "") }; System.out.println("排序之前:" + Arrays.toString(data)); bubbleSort(data); System.out.println("排序之後:" + Arrays.toString(data)); } }
演算法分析
氣泡排序的時間效率是不確定的:最好的情況下,初始序列已經處在有序狀態,執行一趟冒泡即可,做n-1次比較,無需進行任何交換;但在最壞的情況下,初始序列完全逆序,演算法要執行n-1趟冒泡,第i趟做n-i次比較,執行n-i-1次物件交換,此時比較總次數為n*(n-1)/2,資料移動總次數為n*(n-1)*3/2。
氣泡排序演算法的空間效率很高,只需一個附加程式單元用於交換,其空間效率為O(1)。
同時氣泡排序是穩定的