概述
Java中排序算法是非常重要的一部分,這裏簡單分析下插入排序和希爾排序的實現思路及其代碼實現。
常見排序算法時間複雜度表
排序算法 | 平均時間複雜度 | 最差情形 | 穩定度 | 額外空間 | 備註 |
---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n^2) | 穩定 | O(1) | n小時較好 |
插入排序 | O(n^2) | O(n^2) | 穩定 | O(1) | n小時較好 |
選擇排序 | O(n^2) | O(n^2) | 不穩定 | O(1) | n小時較好 |
快速排序 | O(nlogn) | O(n^2) | 不穩定 | O(nlogn) | n大時較好 |
希爾排序 | O(nlogn) | O(n^s)1 < s < 2 | 不穩定 | O(1) | n大時較好 |
歸併排序 | O(nlogn) | O(nlogn) | 穩定 | O(1) | n大時較好 |
堆排序 | O(nlogn) | O(nlogn) | 穩定 | O(1) | n大時較好 |
基數排序 | O(nlogn) | OlogrB | O(n) | O(n) | B爲真數(0-9),r爲基數個十白 |
插入排序
插入排序(insertion Sorting)基本思想:把n個待排序的元素看作成,一個有序表,和一個無序表,
開始時有序表只有一個元素,無序表中有n-1
個元素。排序過程中,每次從無序表中取出一個元素,將其與有序表中進行比較,將其插入在有序表中合適的位置。
插入排序圖解
插入排序代碼實現
public class InsertSort {
public static void insertSort(int[] arr) {
if (arr == null || arr.length) {
throw new IllegalArgumentException();
}
for (int i = 1; i < arr.length; i++) {
// 定義待插入的數
int insertValue = arr[i];
// 定義待插入的位置
int insertIndex = i - 1;
// 如果插入的值小於他前一個值說明還沒有找到這樣的位置,並將前一個值,向後移動
while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
// 退出循環說明已經找到插入的位置
arr[insertIndex] = insertValue;
}
}
}
簡單插入排序存在的問題
假如我們有一個這樣的數組{2, 3, 4, 5, 1},此時我們需要插入的值爲1,那麼執行的過程爲。
- {2, 3, 4, 5, 5}
- {2, 3, 4, 4, 5}
- {2. 3, 3, 4, 5}
- {2, 2, 3, 4, 5}
- {1, 2, 3, 4, 5}
很顯然爲了插入一個1,我們一共移動了4次,這種顯然有點浪費效率了,下面我們使用更加牛皮的排序方法,希爾排序
。
希爾排序
希爾排序簡單介紹
希爾排序是希爾(Donald Shell)於1959年提出的一種排序算法。希爾排序也是一種插入排序,他是簡單插入排序經過改進之後的一種更高的版本,也稱爲縮小增量排序。
希爾排序基本思想
希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。
希爾排序圖解
希爾排序交換法
public class ShellSort {
public static void shellSort(int[] arr) {
if (arr == null || arr.length <= 0) {
throw new IllegalArgumentException();
}
int temp = 0;
for (int gap = arr.length/2; gap > 0;gap /= 2;) {
for (int i = gap;i < arr.length;i++) {
for (int j = i - gap;i >= 0 ; j -= gap) {
if (arr[j] > arr[j + gap]) {
temp = arr[j];
arr[j] = arr[j + gap];
arr[j + gap] = temp;
}
}
}
}
}
}
希爾排序位移法
public class ShellSort {
public static void shellSort(int[] arr) {
if (arr == null || arr.length <= 0) {
throw new IllegalArgumentException();
}
for (int gap = arr.length/2; gap > 0;gap /= 2;) {
for (int i = gap;i < arr.length;i++) {
int insertValue = arr[i];
int insertIndex = i;
while (insertIndex - gap >= 0 && insertValue < arr[insertIndex - gap]) {
arr[insertIndex] = arr[insertIndex - gap];
insertIndex -= gap;
}
arr[insertIndex] = insertValue;
}
}
}
}
代碼寫完,小弟能力有限,歡迎各路大神指點!!!