希尔排序

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

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

2 简单举例:

java 对象组合排序_java 对象组合排序

 

描述:

初始时,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