1. 程式人生 > >氣泡排序法和選擇排序法的排序過程

氣泡排序法和選擇排序法的排序過程

氣泡排序法:

維基百科定義:氣泡排序(Bubble Sort,泡沫排序或氣泡排序)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

氣泡排序對n個專案需要O(n^2)的比較次數,且可以原地排序。儘管這個演算法是最簡單瞭解和實作的排序演算法之一,但它對於少數元素之外的數列排序是很沒有效率的。

java測試程式碼

public class ArraySort {
	public static void main(String[] args) {
		int[] dataArray = { 3, 0, 2, 7, 6, 10, 8, 1, 9, 4, 5 };

		System.out.println("這是原陣列 ");
		for (int da : dataArray) {
			System.out.print(da + " ");
		}

		// 氣泡排序法
		int temp = 0;
		for (int i = 0; i != dataArray.length; ++i) {
			for (int j = i + 1; j != dataArray.length; ++j) {
				System.out.println("");
				for (int da : dataArray) {
					System.out.print(da + " ");
				}
				System.out.print("....." + dataArray[i] + " " + dataArray[j]);

				if (dataArray[i] > dataArray[j]) {
					temp = dataArray[i];
					dataArray[i] = dataArray[j];
					dataArray[j] = temp;
					System.out.print("   交換一次");
				}
			}
		}

		System.out.println("\n這是冒泡法");
		for (int da : dataArray) {
			System.out.print(da + " ");
		}
      }// end main
}// end class

測試結果如下所示:

這是原陣列
3 0 2 7 6 10 8 1 9 4 5  
3 0 2 7 6 10 8 1 9 4 5 .....3 0     交換一次
0 3 2 7 6 10 8 1 9 4 5 .....0 2
0 3 2 7 6 10 8 1 9 4 5 .....0 7
0 3 2 7 6 10 8 1 9 4 5 .....0 6
0 3 2 7 6 10 8 1 9 4 5 .....0 10
0 3 2 7 6 10 8 1 9 4 5 .....0 8
0 3 2 7 6 10 8 1 9 4 5 .....0 1
0 3 2 7 6 10 8 1 9 4 5 .....0 9
0 3 2 7 6 10 8 1 9 4 5 .....0 4
0 3 2 7 6 10 8 1 9 4 5 .....0 5
0 3 2 7 6 10 8 1 9 4 5 .....3 2     交換一次
0 2 3 7 6 10 8 1 9 4 5 .....2 7
0 2 3 7 6 10 8 1 9 4 5 .....2 6
0 2 3 7 6 10 8 1 9 4 5 .....2 10
0 2 3 7 6 10 8 1 9 4 5 .....2 8
0 2 3 7 6 10 8 1 9 4 5 .....2 1     交換一次
0 1 3 7 6 10 8 2 9 4 5 .....1 9
0 1 3 7 6 10 8 2 9 4 5 .....1 4
0 1 3 7 6 10 8 2 9 4 5 .....1 5
0 1 3 7 6 10 8 2 9 4 5 .....3 7
0 1 3 7 6 10 8 2 9 4 5 .....3 6
0 1 3 7 6 10 8 2 9 4 5 .....3 10
0 1 3 7 6 10 8 2 9 4 5 .....3 8
0 1 3 7 6 10 8 2 9 4 5 .....3 2     交換一次
0 1 2 7 6 10 8 3 9 4 5 .....2 9
0 1 2 7 6 10 8 3 9 4 5 .....2 4
0 1 2 7 6 10 8 3 9 4 5 .....2 5
0 1 2 7 6 10 8 3 9 4 5 .....7 6     交換一次
0 1 2 6 7 10 8 3 9 4 5 .....6 10
0 1 2 6 7 10 8 3 9 4 5 .....6 8
0 1 2 6 7 10 8 3 9 4 5 .....6 3     交換一次
0 1 2 3 7 10 8 6 9 4 5 .....3 9
0 1 2 3 7 10 8 6 9 4 5 .....3 4
0 1 2 3 7 10 8 6 9 4 5 .....3 5
0 1 2 3 7 10 8 6 9 4 5 .....7 10
0 1 2 3 7 10 8 6 9 4 5 .....7 8
0 1 2 3 7 10 8 6 9 4 5 .....7 6     交換一次
0 1 2 3 6 10 8 7 9 4 5 .....6 9
0 1 2 3 6 10 8 7 9 4 5 .....6 4     交換一次
0 1 2 3 4 10 8 7 9 6 5 .....4 5
0 1 2 3 4 10 8 7 9 6 5 .....10 8   交換一次
0 1 2 3 4 8 10 7 9 6 5 .....8 7     交換一次
0 1 2 3 4 7 10 8 9 6 5 .....7 9
0 1 2 3 4 7 10 8 9 6 5 .....7 6     交換一次
0 1 2 3 4 6 10 8 9 7 5 .....6 5     交換一次
0 1 2 3 4 5 10 8 9 7 6 .....10 8   交換一次
0 1 2 3 4 5 8 10 9 7 6 .....8 9
0 1 2 3 4 5 8 10 9 7 6 .....8 7     交換一次
0 1 2 3 4 5 7 10 9 8 6 .....7 6     交換一次
0 1 2 3 4 5 6 10 9 8 7 .....10 9   交換一次
0 1 2 3 4 5 6 9 10 8 7 .....9 8     交換一次
0 1 2 3 4 5 6 8 10 9 7 .....8 7     交換一次
0 1 2 3 4 5 6 7 10 9 8 .....10 9   交換一次
0 1 2 3 4 5 6 7 9 10 8 .....9 8     交換一次
0 1 2 3 4 5 6 7 8 10 9 .....10 9   交換一次


選擇排序法

維基百科定義:選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

選擇排序的主要優點與資料移動有關。如果某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有一個將被移到其最終位置上,因此對n個元素的表進行排序總共進行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於非常好的一種。

JAVA測試程式碼

		// 選擇排序法
		int temp = 0;
		for (int i = 0; i != dataArray.length - 1; ++i) {
			int indexMin = i;
			for (int j = i + 1; j != dataArray.length; ++j) {
				System.out.println("");
				for (int da : dataArray) {
					System.out.print(da + " ");
				}
				System.out.print("....." + dataArray[indexMin] + " "
						+ dataArray[j]);

				if (dataArray[j] < dataArray[indexMin]) {
					indexMin = j;
				}
			}
			if (i != indexMin) {
				temp = dataArray[i];
				dataArray[i] = dataArray[indexMin];
				dataArray[indexMin] = temp;
				System.out.print("   交換一次");
			}
		}

測試結果如下所示:

這是原陣列
3 0 2 7 6 10 8 1 9 4 5
3 0 2 7 6 10 8 1 9 4 5 .....3 0
3 0 2 7 6 10 8 1 9 4 5 .....0 2
3 0 2 7 6 10 8 1 9 4 5 .....0 7
3 0 2 7 6 10 8 1 9 4 5 .....0 6
3 0 2 7 6 10 8 1 9 4 5 .....0 10
3 0 2 7 6 10 8 1 9 4 5 .....0 8
3 0 2 7 6 10 8 1 9 4 5 .....0 1
3 0 2 7 6 10 8 1 9 4 5 .....0 9
3 0 2 7 6 10 8 1 9 4 5 .....0 4
3 0 2 7 6 10 8 1 9 4 5 .....0 5     交換一次
0 3 2 7 6 10 8 1 9 4 5 .....3 2
0 3 2 7 6 10 8 1 9 4 5 .....2 7
0 3 2 7 6 10 8 1 9 4 5 .....2 6
0 3 2 7 6 10 8 1 9 4 5 .....2 10
0 3 2 7 6 10 8 1 9 4 5 .....2 8
0 3 2 7 6 10 8 1 9 4 5 .....2 1
0 3 2 7 6 10 8 1 9 4 5 .....1 9
0 3 2 7 6 10 8 1 9 4 5 .....1 4
0 3 2 7 6 10 8 1 9 4 5 .....1 5     交換一次
0 1 2 7 6 10 8 3 9 4 5 .....2 7
0 1 2 7 6 10 8 3 9 4 5 .....2 6
0 1 2 7 6 10 8 3 9 4 5 .....2 10
0 1 2 7 6 10 8 3 9 4 5 .....2 8
0 1 2 7 6 10 8 3 9 4 5 .....2 3
0 1 2 7 6 10 8 3 9 4 5 .....2 9
0 1 2 7 6 10 8 3 9 4 5 .....2 4
0 1 2 7 6 10 8 3 9 4 5 .....2 5
0 1 2 7 6 10 8 3 9 4 5 .....7 6
0 1 2 7 6 10 8 3 9 4 5 .....6 10
0 1 2 7 6 10 8 3 9 4 5 .....6 8
0 1 2 7 6 10 8 3 9 4 5 .....6 3
0 1 2 7 6 10 8 3 9 4 5 .....3 9
0 1 2 7 6 10 8 3 9 4 5 .....3 4
0 1 2 7 6 10 8 3 9 4 5 .....3 5     交換一次
0 1 2 3 6 10 8 7 9 4 5 .....6 10
0 1 2 3 6 10 8 7 9 4 5 .....6 8
0 1 2 3 6 10 8 7 9 4 5 .....6 7
0 1 2 3 6 10 8 7 9 4 5 .....6 9
0 1 2 3 6 10 8 7 9 4 5 .....6 4
0 1 2 3 6 10 8 7 9 4 5 .....4 5     交換一次
0 1 2 3 4 10 8 7 9 6 5 .....10 8
0 1 2 3 4 10 8 7 9 6 5 .....8 7
0 1 2 3 4 10 8 7 9 6 5 .....7 9
0 1 2 3 4 10 8 7 9 6 5 .....7 6
0 1 2 3 4 10 8 7 9 6 5 .....6 5     交換一次
0 1 2 3 4 5 8 7 9 6 10 .....8 7
0 1 2 3 4 5 8 7 9 6 10 .....7 9
0 1 2 3 4 5 8 7 9 6 10 .....7 6
0 1 2 3 4 5 8 7 9 6 10 .....6 10   交換一次
0 1 2 3 4 5 6 7 9 8 10 .....7 9
0 1 2 3 4 5 6 7 9 8 10 .....7 8
0 1 2 3 4 5 6 7 9 8 10 .....7 10
0 1 2 3 4 5 6 7 9 8 10 .....9 8
0 1 2 3 4 5 6 7 9 8 10 .....8 10   交換一次
0 1 2 3 4 5 6 7 8 9 10 .....9 10

:從以上測試可以看出,在排序過程中,冒泡法一旦發現某兩數順序不對則立即對直接進行位置交換,選擇排序法則每次通過一個indexMin變數儲存該次排序“最小值”在陣列中的位置,直到本次結束時才將“最小值”交換到正確的位置。