1. 程式人生 > >排序演算法總結之氣泡排序

排序演算法總結之氣泡排序

氣泡排序(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));
	}
}
排序效果:

image

演算法分析

氣泡排序的時間效率是不確定的:最好的情況下,初始序列已經處在有序狀態,執行一趟冒泡即可,做n-1次比較,無需進行任何交換;但在最壞的情況下,初始序列完全逆序,演算法要執行n-1趟冒泡,第i趟做n-i次比較,執行n-i-1次物件交換,此時比較總次數為n*(n-1)/2,資料移動總次數為n*(n-1)*3/2。

氣泡排序演算法的空間效率很高,只需一個附加程式單元用於交換,其空間效率為O(1)。

同時氣泡排序是穩定的