簡單排序算法時間空間複雜度分析及應用(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;
		}
	}
	


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

  算法複雜度分析:

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

步長序列

最壞情況下複雜度

        與其他算法比較:

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

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

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

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