排序-希尔排序

希尔排序:这里写图片描述
当对0,4,8号数据项完成排序之后,算法向右移动一步,对1,5,9数据项进行排序。这个过程持续进行,直到所有的数据项都已经完成了4-增量排序,也就是说所有间隔为4的数据项之间都已经排列有序

这里写图片描述

在完成以4为增量的希尔排序后,所有元素离他在最终有序序列中的位置都相差不到两个单元。这就是数组基本有序的含义,也正是希尔排序的奥秘所在。这种交错的内部有序的数据项集合,把完成排序所需的工作量降到了最小。
而插入排序对基本有序的数组排序是非常有效的,这样,当数组完成4-增量排序之后,可以进行普通的插入排序,比普通的插入排序快得多。

public class ShellSortTest
{ 
  // int  number;   //数据个数

  public static void shellSort(int array[])
  {
      int h=1; //设定初始值h
       int number=array.length;
       while(h<= number /3 )
           h =h*3+1; //(1,4,13,40,121...)
       while(h>0)   
       {
           for(int i= h;i<number;i++)
           {
            int    temp = array[i];
               //插入排序
               int j= i; 
               while(j>h-1 && array[j-h] >=temp)
               {
                   array[j] =array[j-h];
                   j=j-h;
               }
               array[j] =temp;
           }
           h=(h-1) /3;
       }

  }

  public static void main(String[] args)
  {
     int array[] = {2,4,3,33,22,3,66,77,22,2,343,4,6,3,7,78,3,8,87,5,5,3,334,33,543,4,44,3,3};
     System.out.println("排序前:");
     for (int i = 0; i < array.length; i++)
    {
        System.out.print(array[i]+"  ");
    }
     System.out.println("");
     shellSort(array);
     System.out.println("排序后:");
     for(int i=0;i<array.length;i++)
     {
              System.out.print(array[i]+"  ");
     }
 }

}

希尔排序的原则:直到现在,除了在一些特殊的情况下,希尔排序的时间级大约是 O(N^3/2)到O(N^7/6)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值