排序2:希尔排序
shell排序本质也是一种插入排序,是先分组然后采用直接插入排序。因此也称为缩小增量排序
2.1直接插入排序与希尔排序对比 :
前者时间复杂度O(n^2) 则100个数据需要10000次循环;
后者若分为10组:100个数据分为10组,每组先有序:
10 ^ 2 乘 10=1000次,再插入排序,而插入排序越有序越快,插入排序时时间复杂度小于O(n ^ 2),假设为O(n ^ t),(t<2)
而 1000+O(n ^ 2)< O(n ^ 2),因此希尔排序更快
2.2 原理
注意:①分n组,则每组有n个元素(每组元素算头不算尾)
② 为什么要选择跳跃式分组?
顺序分组并组内排序:
对比该结果与上面的跳跃分组排序可以看出跳跃分组并整体结果更加趋向有序
2.3代码:
//组内插入排序
Static void ShellSort(int *arr,int len,int gap)
{
int tmp;
int i;
int j;
for(i=gap;i<len;i++)
{
Tmp=arr[i];
for(j=i-gap;j>=0;j-=gap)
{
if(arr[j]>tmp)
{
arr[j+gap]=arr[j];
}
else
{
Break;
}
}
arr[j+gap]=arr[j];
}
Void ShellSort(int *arr,int len)
{
int d[] ={5,3,1};//每次分组数,称为增量序列
for(int i=0;i<sizeof(d)/sizeof(0),i++)
{
Shell(arr,len,d[i]);
}
return 0;
}
2.4评价
2.4.1希尔排序的效率取决于分组数的选取,即增量序列的内容,目前没有统一适用的增量序列规则,但是默认:
①增量序列中的值没有除1以外的公因子,若有公因子例如分组为8组,4组,1组,分为4组中包含分8组的数据已经排序,会出现重复排序。
②最后的组数必须为1,才能保证整个序列全部有序
2.4.2时间复杂度,与增量序列有关,一般在O(n1.3)到O(n1.5)之间,比直接插入排序快
2.4.3 不稳定,有跳跃式排序