Java代码 希尔排序

每天都更,最近再研究算法,希望能够把算法搞明白

希尔排序的思想

其实就是分组的插入排序
先将整个待排序列分割成若干子序列,然后依次根据缩减增量进行排序
如下举例:
n=12; 15 26 5 39 19 38 10 3 58 78 9 98
第一次 gap=12/2=6
15 26 5 39 19 38 10 3 58 78 9 98
1A 2A 3A 4A 5A 6A 1B 2B 3B 4B 5B 6B
分成了六组分别是(15,10)(26,3)(5,58)(39,78)(19,9)(38,98)
第二次 gap=6/2=3
15 26 5 39 19 38 10 3 58 78 9 98
排完序之后为:
10 3 5 39 9 38 15 26 58 78 19 98
1A 2A 3A 1B 2B 3B 1C 2C 3C 1D 2D 3D
分成3组分别是(10,39,15,78)(3,9,26,19)(5,38,58,98)
第三次 gap=3/2=1
排序完成后
10 3 5 15 9 38 39 19 58 78 26 98
1A 1B 1C 1D 1E 1F 1G 1H 1I 1J 1K 1L
分成一组
再进行一次插入排序即可 因为在元素基本有序的情况下 插入排序的效率高
完成排序之后
3 5 9 10 15 19 26 38 39 58 78 98
Java代码如下

package sort;
//希尔排序 
//2015-05-30
public class ShellSort {
//第一种方式 希尔排序完全按照定义来写
//  public void ShellSort1(int a[],int n){
//      int i,j,gap;
//      for(gap=n/2;gap>0;gap/=2){
//          for(i=0;i<gap;i++){
//              for(j=i+gap;j<n;j+=gap){
//                  if(a[j]<a[j-gap]){
//                      int temp=a[j];
//                      int k;
//                      for( k=j-gap;k>=0&&a[k]>temp;k-=gap){
//                      a[k+gap]=a[k];
//                      }
//                      a[k+gap]=temp;
//                  }
//              }
//          }
//      }
//  }
//第二种方式 希尔排序代码优化,每次都从数组的第gap个元素开始进行插入排序
//  public void ShellSort2(int a[],int n){
//      int j,gap;
//      for(gap=n/2;gap>0;gap/=2){
//          for(j=gap;j<n;j++){
//              if(a[j]<a[j-gap]){
//                  int temp=a[j];
//                  int k=j-gap;
//                  while(k>=0&&a[k]>temp){
//                      a[k+gap]=a[k];
//                      k-=gap;
//                  }
//                  a[k+gap]=temp;
//              }
//          }
//      }
//  }
    //第三种方式  插入排序简化一下
    public void ShellSort3(int a[],int n){
        int i,j,gap;
        for(gap=n/2;gap>0;gap/=2){
            for(i=gap;i<n;i++){
                for(j=i-gap;j>=0&&a[j]>a[j+gap];j-=gap){
                    swap(a,j,j+gap);
                }
            }
        }
    }
    //交换方法
     public void swap(int a[],int p,int q ){
            int k;
            k=a[p];
         a[p]=a[q];
            a[q]=k;

        }  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值