希爾排序

希爾排序的優點:希爾排序,是效率最高的簡單排序的算法了,在很多情況下我們都會很喜歡希爾排序的,因爲希爾排序的代碼量很小,而且希爾排序並不需要使用額外的內存空間,和更爲高效的算法比,只要是我們的N不是特別的大(N是需要排列的元素)我們都會優先考慮希爾排序,因爲希爾排序比更加高級的算法相比,排序上的時間是差不多的。尤其是當我們所用的編程語言沒有內置的高效的算法的時候,我們就可以優先考慮希爾排序了。


希爾排序的本質:希爾排序是基於插入排序的快速排序的算法,希爾排序爲了加快排序速度,所以簡單的改進了插入排序,交換不相鄰的元素以對數組的局部進行排序,並且最終用插入排序將局部有序的數組排序。


希爾排序的思想:希爾排序的思想是數組中間任意間隔爲h的元素都是有序的。這樣的數組被我們成爲h有序數組。換句話說,一個h有序數組就是h個相互獨立的有序數組編織在一起組成的一個數組。在進行排序時,如果h很大,我們就會將元素移動到很遠的地方,爲實現更小的h有序創造方便。用這種方式,對於任意以1結尾的h序列,我們都能夠將數組排序,這就是希爾排序。


希爾排序高效的原因:插入排序中移動元素是移動一個距離,我們的小改動是每次交換元素的時候移動的距離由1改爲h了,這樣,希爾排序的實現就轉換成了一個類似於插入排序,但是使用了不同的增量,希爾排序它權衡了子數組的規模和有序性,在排序之初,各個子數組都很短,排序之後子數組都是部分有序的,最後一句話就是:能夠透徹的理解希爾排序的性能至今仍是一項挑戰,希爾排序也是我們唯一無法準確描述其對於亂序的數組的性能特徵的排序方法。


讓我們看一下希爾排序的代碼:

public class Shell {

	public static void sort(Comparable[] a) {
		int N = a.length;
		int h = 1;
		while (h < N / 3)
			h = 3 * h + 1;
		while (h >= 1) {
			for (int i = h; i < N; i++) {
				for (int j = i; j >= h && less(a[j], a[j - h]); j -= h)
					exch(a, j, j - h);
			}
			h = h / 3;
		}
	}

	public static boolean less(Comparable v, Comparable w) {
		return v.compareTo(w) < 0;
	}

	private static void exch(Comparable[] a, int i, int j) {
		Comparable t = a[i];
		a[i] = a[j];
		a[j] = t;
	}

	public static void show(Comparable[] a) {
		for (int i = 0; i < a.length; i++) {
			System.out.println(a[i] + " ");
			System.out.println();
		}
	}

	public static boolean isSorted(Comparable[] a) {
		for (int i = 1; i < a.length; i++)
			if (less(a[i], a[i - 1]))
				return false;
		return true;
	}

	public static void main(String[] args) {
		String[] a = "B,D,C,A,E,G,F, ".split(",");
		sort(a);
		assert isSorted(a);
		show(a);

	}

}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章