希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序算法。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] ------------------------------------------------