理解希爾排序,縮減增量排序

2021-06-01 09:18:28 字數 1441 閱讀 1004

話說使用氣泡排序,選擇排序和插入排序,都是平均使用了on2的時間,因為它們都是只能一次移動乙個位置。如果對於這種情況,即最小的數在最後一位,那麼就需要根據具體地演算法將資料從最後慢慢地往前移了。對於氣泡排序,時間不會減少;對於選擇排序時間也不會減少,因為每次都將第二大的數又再一次放到最後一位了;對於插入排序,會稍微地提高一次效率,因為只能最後一次才需要移動陣列。

那有沒有可以一次性移動多個位置的演算法呢,那就是希爾排序,它是對於插入排序的地種改進。即使得要進行排序的數,在進行位置移動的時候,可以一次性地移動 多個位置,再不用一位一位地移動了。因為需要一次性移動多個位置,那就需要有乙個移動的位置數,即gap。同時,它有乙個要求,是必須要滿足的,就是對於 陣列中的每個數i,在進行移動之後,必須滿足array[i]<=array[i+gap]。即前面的數必須要比後面的數小(按從小到大排序的 話)。因為每次移動是超過乙個位置的移動,因為在移動之後,不能保證前乙個數必須比後乙個數小,因為還需要進行第二次移動,同時最後必須要有乙個 gap=1情況,即最後有乙個類似插入排序的動作。只不過到最後進行插入排序時,因為前面的移動已使得陣列已相對排序,所以最後一次插入排序速度很快。

因為有gap的存在,希爾排序實際上就是乙個先將陣列按照gap大小進行分組,然後對每乙個分組進行插入排序的過程。對分組進行插入排序,以保證每個分組都是已經排好序的。這樣一直到gap=1時,實際上就是乙個將乙個大組進行插入排序了。

這幾個主要有兩個需要注意的,一就是分組的概念,即gap的概念,使用gap將陣列按照一定的間隔進行排序;二就是插入排序的概念,在每個分組中是使用插入排序進行排序的。主要弄清楚這兩個部分,那麼在理解希爾排序的程式演算法時,就能很好地理解了。

使用gap一般是按照從大到小的順序,同時也有乙個如何使用gap的問題。不同的gap會使得最終的排序效率會不一樣,因為這影響實際的分組,以及在多次分組之後,是否存在重複排序的問題。具體的選擇這裡就直接省略了,直接使用wikipedia中的乙個gap陣列進行處理。

private static void shellsort(int ints) ;

//首先確定gap大小

int i = 0;

while(gaps[i] < ints.length)

i++;

//進行分組再排序了

while(i >= 0)

ints[k] = temp;

}//gap往下減1,即使用下乙個比較小的gap

i--;

}}

希爾排序的效率很高,一般情況下為on3/2,但好的gap陣列可以達到on5/4,以致on7/6,這樣的效率足夠和快速排序相比了。並且,這個理解起來簡單。只需要記住以下幾點即可:

插入排序在陣列已經接近排好序的情況下,效率很高,可以達到on

使用希爾選擇gap可以將陣列從快速的方式組織成接近排好序的情況,使用增量式移位比單個移位更快

希爾排序的內部始終是插入排序,並且最後一次肯定是乙個最原始的插入排序

排序演算法(四) 希爾排序 增量排序

希爾排序思想 將現有資料分為d個組,在每個分組內使用直接插入排序演算法,使得整個資料段越來越有序。接著繼續將資料分組並使用直接插入排序 分組會越來越小 直到分組為1。每個分組數一般互質 時間複雜度 o n 1.3 1.5 空間複雜度 o 1 穩定性 不穩定 void shell int arr,in...

希爾排序增量怎麼確定 排序演算法之希爾排序

本文將介紹排序演算法中的希爾排序,它是高階版的插入排序,是我們第乙個介紹的有點難度的演算法。希爾排序,是插入排序的乙個公升級版本。在插入排序中,無論資料是怎麼分布的,依然循規蹈矩的一步一步比較,移動,插入。在希爾排序中,採用跳躍式的方式,按照某個增量gap將陣列元素分成多組序列,並使用插入排序使得各...

排序五之希爾排序(縮小增量排序)

shell sort 氣泡排序演算法,選擇排序演算法和插入排序演算法的思路比較直觀,但排序的效率都比較低。對於遇到大量的資料需要排序時,shell排序便是其他更為高效的演算法之一。sell排序演算法嚴格來說基於插入排序的思想,又稱希爾排序或縮小增量排序。shell排序的基本流程如下 1 將有n個元素...