排序:希爾排序

希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序算法。java

希爾排序是把記錄按下標的必定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減小,每組包含的關鍵詞愈來愈多,當增量減至1時,整個文件恰被分紅一組,算法便終止。

接下來咱們以數組:82 ,31 ,29 ,71, 72, 42, 64, 5, 110爲例算法

下標 0 1 2 3 4 5 6 7 8
元素 82 31 29 71 72 42 64 5 110

該數組長度爲9,初始增量先設置爲 數組長度的二分之一,向下取整,此處就是4shell

那咱們就能夠把以上數組分爲如下四個子數組,而後對每一個子數組分別進行插入排序數組

子數組1測試

下標 0 4
元素 82 72

 子數組2spa

下標 1 5
元素 31 42

子數組3code

下標 2 6
元素 29 64

子數組4排序

下標 3 7
元素 71 5

排序完獲得如下數組:ci

下標 0 1 2 3 4 5 6 7 8
元素 72 31 29 5 82 42 64 71 110

從新設置增量 = 以前增量的1/2   便是4/2=2element

在增量爲2的前提下,分紅如下兩個子數組,分別對其進行插入排序

子數組1

下標 0 2 4 6 8
元素 72 29 82 64 110

子數組2

下標 1 3 5 7
元素 31 5 42 71

排序完的數組應該是:

下標 0 1 2 3 4 5 6 7 8
元素 29 5 64 31 72 42 82 71 110

從新設置增量 = 以前增量的1/2   便是2/2=1

增量爲1的時候,就是對整個數組分紅一組,進行插入排序

最後獲得:

下標 0 1 2 3 4 5 6 7 8
元素 5 29 31 42 64 71 72 82 110

 

 希爾排序(Java):

public static int[] shellSort(int[] elements) {
	int temp = 0;
	if(null == elements || 1 >= elements.length) {
		// do nothing
	} else if(2 == elements.length) {
		if(elements[0] > elements[1]) {
			temp = elements[0];
			elements[0] = elements[1];
			elements[1] = temp;
		}
		return elements;
	} else {
		int increment = elements.length >> 1;// 增量
		while(increment >= 1) {
			for(int g = 0; g < increment; g++) {
				// 遍歷組  組數:increment
				for(int i = (g+increment); i < elements.length; i+=increment) {
					// 對每一組的元素進行插入排序
					int k = i - increment;
					int n = i;
					while(k >= 0) {
						if(elements[n] < elements[k]) {
							temp = elements[n];
							elements[n] = elements[k];
							elements[k] = temp;
							n = k;
							k = k - increment;
						} else {
							k = -1;
						}
					}
				}
			}
			System.out.println("increment="+increment+",elements="+Arrays.toString(elements));
			System.out.println("------------------------------------------------");
			increment = increment >> 1;
		}
	}
	return elements;
}

測試代碼:

public static void main(String[] args) {
	int[] array = {82 ,31 ,29 ,71, 72, 42, 64, 5, 110};
	shellSort(array);
}

測試結果:

increment=4,elements=[72, 31, 29, 5, 82, 42, 64, 71, 110]
------------------------------------------------
increment=2,elements=[29, 5, 64, 31, 72, 42, 82, 71, 110]
------------------------------------------------
increment=1,elements=[5, 29, 31, 42, 64, 71, 72, 82, 110]
------------------------------------------------
相關文章
相關標籤/搜索