Java希尔排序

希尔排序

        突然想着写一波Java的常用排序算法,有需要的小伙伴可以关注我一波,我陆续会出Java的常用排序算法。

1. 原理:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

2 简单举例:

 

描述:

初始时,10个数的无序序列

(1)在第一趟排序中,增量为数组的一半,相隔距离为 5 的元素组成一组,可以分为 5 组,按照直接插入排序的方法对每个组进行排序。

(2)在第二趟排序中,增量缩小一半,取奇数,为3,相隔距离为 3的元素组成一组,可以分为3 组,按照直接插入排序的方法对每个组进行排序。。

(3)在第三趟排序中,增量缩小一半,取奇数为1, 相隔距离为 1 的元素组成一组,只有一组。按照直接插入排序的方法对该组进行排序。至此,排序已经结束。

3.代码实现:

public class XiEr {
public static void xiEr(int r[]){
boolean flag=true;
double d1=r.length;
int insertNumber;//要插入的数据,希尔排序其实跟直接插入排序原理差不多,但是直接插入排序只进行增量为1的插入排序
while(flag){
d1=Math.ceil(d1/2);//d1为增量
int d=(int)d1;
for(int x=0;x<d;x++){
for(int i=x+d;i<r.length;i+=d){
int j=i-d;
insertNumber=r[i];//将要插入的数据赋值给变量insertNumber,要插入的数据通过x每次微调1位,外层循环x<d是为了使插入数据不超过数组长度
while(j>=0&&insertNumber<r[j]){//要插入的数据和它前面差增量位的数比较,要插入的元素小于第j个元素
r[j+d]=r[j];//第j个元素向后移动增量位
j-=d;

}
r[j+d]=insertNumber;//退出while循环,即插入的数据已经不小于r[j]了,这时插入数据插入到r[j]后面
}
}
if(d==1){
flag=false;//执行完增量为1的直接插入排序,把flag变为false,使不继续执行排序
}

}
for(int b:r){
System.out.print(b+" ");
}
}
public static void main(String args[]){
int a[]={52,39,67,95,70,8,25,3,56,5};
    xiEr(a);
}

}

运行结果:3 5 8 25 39 52 56 67 70 95 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值