希爾排序的快慢處於中等水平,我們知道插入排序的平均時間複雜度為o(n^2),但也取決於序列的混亂程度,越混亂插入排序越慢,為了減小混亂程度加快插入排序的速度,希爾排序就派上用場了(可以說希爾排序是插入排序的加速版)
希爾排序其實類似於插入排序,插入排序是要在間隔為1的為基礎上選擇未排序集合的第乙個元素在已排序的元素集合間插入適當位置,而希爾排序則是不斷以間隔g進行插入排序操作
間隔g不是隨便取的間隔,是有規定的g=
g中每乙個元素是前乙個的3倍+1,g取到什麼時候位置呢,不可能無限取下去,這裡規定g>n就停止了(n是待排序序列的元素個數),然後把g中所有元素從大到小取出作為間隔距離一次進行插入排序
看圖就明白了
**
#include
#include
using
namespace std;
typedef
long
long ll;
ll cnt=0;
intinsertsort
(int a,
int n,
int g)
//插入排序
a[pos+g]
=temp;
}return0;
}int
shellsort
(int a,
int m,
int g,
int n)
//希爾排序
printf
("%d\n"
,cnt)
;return0;
}int
main()
for(
int i=gnum-
1;i>=
0;i--
)printf
("%d "
,g[i]);
printf
("\n");
shellsort
(a,gnum,g,n)
;for
(int i=
1;i<=n;i++
)printf
("%d "
,a[i]);
return0;
}
排序 希爾排序模板
希爾排序又稱縮小增量排序 1 先取定乙個小於n的整數gap1作為第乙個增量,把整個序列分成gap1組。所有距離為gap1的倍數的元素放在同一組中,在各組內分別進行排序 分組內採用直接插入排序或其它基本方式的排序 一般gap1為n 2,一次往後類推 gap2 gap 2,若為奇數,則gap2 gap1...
C 模板實現希爾排序
希爾排序是一種高效的排序演算法,原理是將大陣列分成若干個小陣列,對每個小陣列進行排序.之後縮短步長,對原陣列重新劃分小組,繼續對每個小組進行排序.直到步長變為1後,進行最後一次直接插入排序.此演算法高效的原因在於直接插入排序在對基本有序的序列進行排序是十分高效的.前期劃分子陣列進行排序,可以逐漸使得...
排序 希爾排序
希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...