1. 程式人生 > >簡單排序演算法時間空間複雜度分析及應用(7)-希爾排序

簡單排序演算法時間空間複雜度分析及應用(7)-希爾排序

希爾排序,屬於插入排序的一種,是直接插入排序的加強版。在希爾排序中引入了步長(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;
		}
	}
	

圖文解析:略(同直接插入排序一樣)

  演算法複雜度分析:

希爾排序複雜度和補償序列的選取相關,如左下所示:

步長序列

最壞情況下複雜度

        與其他演算法比較:

處理大資料排序的時候,效率是比不上快速排序的;

直接插入排序比希爾排序比較次數和移動次數都少很多,資料量越大效果越明顯;

直接插入排序是穩定的,希爾排序是不穩定的;