簡單排序演算法時間空間複雜度分析及應用(7)-希爾排序
阿新 • • 發佈:2019-01-30
希爾排序,屬於插入排序的一種,是直接插入排序的加強版。在希爾排序中引入了步長(gap)的概念,然而在插入排序中,步長預設為1。正如我們直接堆插入排序的分析,資料集合的排列順序對插入排序的效率會由很大的影響,而且影響會很大。而希爾排序正式從這個方向對直接插入排序進行加強。
基本概念:
將無序陣列分割為若干個子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,
對各個子序列進行插入排序;然後再選擇一個更小的增量,再將陣列分割為多個子序列進行
排序......最後選擇增量為1,即使用直接插入排序,使最終陣列成為有序。
即,希爾排序是將資料集合按照步長gap相隔的子資料組成多個子資料集合,再進行直接插入
排序,最後以步長為1來進行排序,此時gap為1的排序過程和直接插入排序複雜的不是一個級別的
複雜度。
框架分析:
希爾排序最外層的迴圈是步長的遞減的迴圈,內迴圈就是直接插入排序演算法了,不過這個和
普通的直接插入排序演算法不一樣,這個步長gap為最外層迴圈的迴圈節點值(gap)。其他的情況
和概念同直接插入排序一樣。
演算法穩定性:
這個演算法是不穩定的,再資料集合中,相等的資料在排序的過程中相對位置會發生變化。
程式碼實現:
/* * 希爾排序 */ public static void shellSort(){ int n = 0 ; //獲取最大希爾排序步數 while(n <= array.length) { n = n*3 +1; } while(n > 0) { for(int i = n ; i < array.length; ++i) { int j = i - n; int temp = array[i]; while(j>=0&&array[j]>temp){ array[j + n] = array[j]; j = j - n; } array[j + n] = temp; } n = (n -1)/3; } }
圖文解析:略(同直接插入排序一樣)
演算法複雜度分析:
希爾排序複雜度和補償序列的選取相關,如左下所示:
步長序列 |
最壞情況下複雜度 |
與其他演算法比較:
處理大資料排序的時候,效率是比不上快速排序的;
直接插入排序比希爾排序比較次數和移動次數都少很多,資料量越大效果越明顯;
直接插入排序是穩定的,希爾排序是不穩定的;