zoukankan      html  css  js  c++  java
  • 排序_希尔排序

    希尔排序类似插入排序,但是希尔排序是有间隔的,从代码中可以明显对比看出。希尔排序有三个标记值,一个是标记着临时数据,需要插入正确位置的数据,其每一次循环初始值都是outer指向的数值。另外两个是标记着需要比较的两个对象,outer和innner,outer的初始值是h,innner的初始值跟outer一样,跟插入不同的是innner的指针的移动是每隔h个往前移动,根据这个法则,只有当inner等于h时,才能进行最后一次的循环比较,所以innner〉h-1
    希尔排序的最外层循环跟插入排序不同,插入排序是outter来决定的,希尔排序是由间隔数决定的。

    public class ArraySh {
        private long [] a;
        private int nElems;
        public ArraySh(int maxSize) {
            a=new long[maxSize];
            nElems=0;
        }
        //插入
        public void insert(long value) {
            a[nElems++]=value;
        }
        //显示
        public void display() {
            for(int j=0;j<nElems;j++)
                System.out.print(a[j]+" ");
            System.out.println();
        }
        //排序
        public void shellSort() {
            int inner,outer;
            long temp;
            int h=1;//间隔(通过计算)
            while(h<=nElems/3)
                h=h*3+1;//h由nElems来决定,循环过后,h的值就是真实的初始值
            
            //h的改变,h的值来确定循环的次数
            while(h>0) {//希尔排序与插入排序对比,多了一层外面的h循环
                //每次循环outer的值是0+h
                for(outer=h;outer<nElems;outer++) {
                    temp=a[outer];
                    inner=outer;
                    //反着想,每隔h个,outer前面的数据都会是有序的,所以innner指向的数据不能是下标为h-1的数据的前面,不会对这个前面的数据进行比较
                    while(inner>h-1&&a[inner-h]>=temp) {
                        a[inner]=a[inner-h];
                        inner-=h;
                        
                    }
                    a[inner]=temp;
                }
                h=(h-1)/3;
            }
                
            
            
            
            
            
        }
    
    
    
    }
    public class Test {
    
        public static void main(String[] args) {
            int maxSize=100;
            ArraySh array=new ArraySh(maxSize);
            array.insert(77);
            array.insert(99);
            array.insert(44);
            array.insert(55);
            array.insert(22);
            array.insert(88);
            array.insert(11);
            array.insert(0);
            array.insert(66);
            array.insert(33);
            array.display();
            array.shellSort();
            array.display();
    
        }
    
    }
  • 相关阅读:
    『ORACLE』 DG切换主备库角色(11g)
    Java基础语法(三)---数组
    JDK安装与配置详细图文教程
    谁把20岁上下的你给洗脑了
    看看已堕落的自己
    关于Git
    自定义UIDatePikerView
    细节关注(持续更新。。。)
    如何生成圆形的图片
    高效使用你的Xcode
  • 原文地址:https://www.cnblogs.com/S-Mustard/p/8097451.html
Copyright © 2011-2022 走看看