數組作爲應用最爲廣泛的一種數據結構,對數組實現簡單排序的思想是每一個開發者的基本功。雖然實際的業務開發中用的很少,但是作爲開發者,我們更看重的是其中所體現的一種思想。
現設定一個數組 num
int[] num = new int[] { 1, 2, 3, 5, 4, 7, 1, 9, 2, 4, 5, 8, 9, 12, 45, 34, 56, 78, 233, 123, 987 };
我們定義一個打印數組的方法printOut
// 打印數組
public static void printOut(int[] num) {
System.out.print("[");
for (int i = 0; i < num.length; i++) {
if (i == num.length - 1) {
System.out.println(num[i] + "]");
} else {
System.out.print(num[i] + ",");
}
}
}
1.冒泡排序
假設有N個數據需要排序,則從第0個數開始,依次比較第0和第1個數據,如果第0個大於第1個則兩者交換,否則什麼動作都不做,繼續比較第1個第2個…,這樣依次類推,將數據最大的數排到數組尾,就像水裏的泡泡一樣往上冒
public static void bubbleSort(int[] num) {
System.out.println("------------冒泡排序法---------------------");
for (int i = 0; i < num.length; i++) {
for (int j = i + 1; j < num.length; j++) {
// num[i] > num[j] 排出來從小到大;
// num[i] < num[j] 排出來從大到小
if (num[i] > num[j]) {
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
}
冒泡排序的效率O(N*N),比較N*N/2,交換N*N/4;
2.簡單選擇排序
假設有N條數據,則暫且標記第0個數據爲MIN(最小),使用OUT標記最左邊未排序的數據,然後使用IN標記第1個數據,依次與MIN進行比較,如果比MIN小,則將該數據標記爲MIN,當第一輪比較完後,最終的MIN與OUT標記數據交換,依次類推
// 簡單選擇排序
public static void selectSort(int[] num) {
System.out.println("------------選擇排序法---------------------");
for (int i = 0; i < num.length - 1; i++) {// 做第i趟排序
int k = i;
for (int j = k + 1; j < num.length; j++) {// 選最小的記錄
// 反向排序
// if (num[j] > num[k]) {
// k = j;// 記下目前找到的最大值所在的位置
// }
// 正向排序
if (num[j] < num[k]) {
k = j; // 記下目前找到的最小值所在的位置
}
}
// 在內層循環結束,也就是找到本輪循環的最小的數以後,再進行交換
if (i != k) { // 交換a[i]和a[k]
int temp = num[i];
num[i] = num[k];
num[k] = temp;
}
}
}
選擇排序的效率:O(N*N),比較N*N/2,交換<N; 選擇排序與冒泡排序比較,比較次數沒有明顯改變,但交換次數明顯減少了很多3.插入排序
插入排序是在部分數據有序的情況下,使用OUT標記第一個無序的數據,將其提取保存到一箇中間變量temp中去,使用IN標記空位置,依次比較temp中的值與IN‐1的值,如果IN‐值大於temp的值,則後移,直到遇到第一個比temp小的值,在其下一個位置插入
// 插入排序
// 插入排序就是每一步都將一個待排數據按其大小插入到已經排序的數據中的適當位置,直到全部插入完畢。
public static void insertSort(int[] unsorted) {
System.out.println("------------插入排序法 ------------------");
for (int i = 1; i < unsorted.length; i++) {
if (unsorted[i - 1] > unsorted[i]) {
int temp = unsorted[i];
int j = i;
while (j > 0 && unsorted[j - 1] > temp) {
unsorted[j] = unsorted[j - 1];
j--;
}
unsorted[j] = temp;
}
}
}
插入排序的效率:O(N*N), 比較N*N/4,複製N*N/4;插入排序在隨機數的情況下,比冒泡快一倍,比選擇稍快;在基本有序的數組中,插入排序幾乎只需要O(N);在逆序情況下,並不比冒泡快;