数据结构与算法——希尔排序(Java实现)

算法背景
 * 对于大规模乱序数组,插入排序很慢;因为它只能交换相邻元素
 * ,因此元素只能从数组的一端一点一点地移动到另一端。
 * 希尔排序为了加快速度,简单滴改进了插入排序,交换不相邻的
 * 元素对数组的局部进行排序,并最终用插入排序将局部有序的数组
 * 排序





希尔排序思想

 * 使数组中任意间隔为H的元素都是有序的,换句话说,一个H有序数
 * 组就是H个相互独立的有序数组编织在一起组成的一个数组

public class sell_sort{
   public static void sort(Comparable[] a)
   {
  //将数组升序排列
  int N=a.length;
  int H=1;
  while(H<N/3) H=3*H+1;
  while(H>=1)
  {
  //将数组变为H有序
  for(int i=H;i<N;i++)
  {
  //将a[i]插到a[i-H],a[i-2H],a[i-3H]...之间
  for(int j=i;j>=H&&(a[j].compareTo(a[j-H])<0);j-=H)
  {
  Comparable t=a[j];
  a[j]=a[j-H];
  a[j-H]=t;   
  }
  H=H/3;
  }
  }
   }
}


//上述算法在最坏情况下的比较次数和N^(3/2)正相关
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值