排序2:希尔排序

排序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 不稳定,有跳跃式排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值