排序算法-希爾排序(Java實現)

希爾排序

希爾排序是希爾(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

發佈了18 篇原創文章 · 獲贊 30 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章