希爾排序
希爾排序是希爾(Donald Shell)於1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的一個更高效的版本,也稱爲縮小增量排序,同時該算法是衝破O(n2)的第一批算法之一。
基本思想
設待排序元素序列有n個元素
1.取一個整數increment(小於n)作爲間隔將全部元素分爲increment個子序列
2.每間隔increment取一個元素,並放在同一個子序列中,對每個子序列實行直接插入排序。
3.縮小間隔increment
4.重複上述子序列劃分和排序工作。直到increment=1,即所有元素放在同一個子序列中進行最後的排序。
簡單點~
假設有數組:{a0,a1,a2,a3,a4,a5,a6,a7,a8,a9}
此時 n = 10
1.一般情況下,我們取increment爲:10/2 = 5,則此時:{a0,a5}、{a1,a6}、{a2,a7}、{a3,a8}、{a4,a9}這五組就是該數組的子序列,分別對這些子序列進行插入排序。
2.我們再取increment爲:5/2 = 2,則此時:{a0,a2,a4,a6,a8}和{a1,a3,a5,a7,a9}這兩組就是該數組的子序列,分別對這兩個序列進行插入排序。
3.我們再取increment爲:2/1 = 1,則此時:{a0,a1,a2,a3,a4,a5,a6,a7,a8,a9}所有元素都在同一個子序列中。
4.此時對其進行插入排序,因爲有前面的工作基礎,大多數元素已經基本有序,所以排序速度仍然很快。
從上面我們可以看到,增量increment是在逐漸減小的,所以這個方法我們也叫他爲:縮小增量排序。
圖示:
代碼實現
public class ShellSort {
public static void main(String[] args) {
int[] arr = new int[] {3,5,6,7,83,2,5,79,98,0,100};
shellSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void shellSort(int[] arr) {
int n = arr.length;
for(int increment = n/2;increment > 0;increment/=2) {
//下面這段代碼和插入排序相同,只是這裏的間隔是increment
//直接插入排序的間隔是1
for(int i = increment;i < arr.length;i++) {
int temp = arr[i];
int t = i-increment;
while(t >= 0 && arr[t] > temp) {
arr[i] = arr[t];
t -= increment;
}
arr[t+increment] = temp;
}
}
}
}
本篇完,如果有錯誤的地方歡迎大家指正
不定時發發筆記,歡迎大家來搞~
我的個人博客:www.fangjiaxian.cn