資料結構是指資料在電腦儲存空間中(或磁碟中)的安排方式,而演算法就是指軟體程式用來操作這些結構中的資料的過程。
一、冒泡排序
冒泡排序是所有排序裡最簡單但又是效率最低的排序,例如10個資料項目的排序次數是:10+9+8+7...+1
N個資料項目,第一趟排序有N-1次比較,第二次N-2次比較,如此類推,排序次數是:(N-1)+(N-2)+(N-3)+...+1 = N*(N-1)/2
public static void bubbleArray(int[] array) { // 最多做n-1趟排序 for (int i = 0; i < array.length - 1; i++) { // 對當前數組array[0......length-i-1]進行排序 // j的範圍是在逐步縮小的,因為內部迴圈走過一遍以後,最大或者最小的肯定已經放到了最後面。 for (int j = 0; j < array.length - i - 1; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } for (int x = 0; x < array.length; x++) System.out.println(array[x]); System.out .println("--------------------------------------------"); } } public static void main(String[] args) { int[] array = new int[] { 5, 4, 3, 2, 1 }; bubbleArray(array); }
輸出:
4
3
2
1
5
--------------------------------------------
3
2
1
4
5
--------------------------------------------
2
1
3
4
5
--------------------------------------------
1
2
3
4
5
--------------------------------------------
二、選擇排序
選擇排序開始從左邊第一個元素作為基數開始和右面的進行比較,根據大於或者小於進行比較,當找到了比基數大的最大元素或者比基數小的最小元素的時候,將這兩個元素進行交換,然後再從左邊第二個元素開始,以此迴圈。
因此,選擇排序和冒泡排序執行了相同次數的比較:N*(N-1)/2
對於10個資料項目,需要45次比較,但10個資料項目只需要少於10次交換。資料量較大時,選擇排序優於冒泡排序。
public static void selectionArray(int[] array) { // index用於記錄最小值的下標 int i, j, temp, index, min; for (i = 0; i < array.length - 1; i++) { min = array[i]; index = i; for (j = i + 1; j < array.length; j++) { if (min > array[j]) { min = array[j]; index = j; } } temp = array[i]; array[i] = array[index]; array[index] = temp; for (int x = 0; x < array.length; x++) System.out.println(array[x]); System.out.println("--------------------------------------------"); } } public static void main(String[] args) { int[] array = new int[] { 5, 1, 4, 3, 2, 6 }; selectionArray(array); }
min = array[j]; 確保了每一次對比都將最小的元素更新,j的迴圈結束以後,能找到最小的元素的下表,然後再i的迴圈裡進行元素交換。
輸出:
1
5
4
3
2
6
--------------------------------------------
1
2
4
3
5
6
--------------------------------------------
1
2
3
4
5
6
--------------------------------------------
1
2
3
4
5
6
--------------------------------------------
1
2
3
4
5
6
--------------------------------------------
三、插入排序
插入排序是三種基本排序演算法裡最好的一種排序,一般情況下,它比冒泡排序要快一倍,比插入排序還要快一些。
插入排序就是每一步都將一個待排資料按其大小插入到已經排序的資料中的適當位置,直到全部插入完畢。
插入排序方法分直接插入排序和折半插入排序兩種,這裡只介紹直接插入排序,
在第一趟演算法中,最多比較1次,第二趟最多比較2次,以此類推,最後一趟比較最多,N-1次。
因此有1+2+3+...+(N-1)=N*(N-1)/2次,因為每一趟排序發現插入點之前,平均只有全體資料的一半進行了比較,
因此比較次數為:N*(N-1)/4 次,
示範了對4個元素進行直接插入排序的過程,共需要(a),(b),(c)三次插入。
public static void insertSort(int[] array) { for (int i = 1; i < array.length; i++) { int t = array[i]; int j = i; //while部分就是在已經排好序的局部元素進行元素互換 while ((j > 0) && (array[j - 1] > t)) { array[j] = array[j - 1];// 將已排好序的元素往右移 --j; } array[j] = t;//將元素插入到已經排好序的局部元素的合適位置 for (int x = 0; x < array.length; x++) System.out.println(array[x]); System.out.println("==========================="); } } public static void main(String[] args) { int[] array = {5, 1, 4, 2, 3}; insertSort(array); }
輸出:
1
2
4
5
9
23
27
45
插入排序部分引用了:http://www.cnblogs.com/kkun/archive/2011/11/23/2260265.html