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();
    
        }
    
    }
  • 相关阅读:
    Mysql 批量插入数据的方法
    sql server 多行合并一行
    跨服务器多库多表查询
    OPENQUERY用法以及使用需要注意的地方
    C# 判断操作系统的位数
    rpc介绍
    JavaScript decodeURI()与decodeURIComponent() 使用与区别
    UNIX 时间戳 C#
    C# winform javascript 互调用
    oracle 实例名和服务名以及数据库名区别
  • 原文地址:https://www.cnblogs.com/S-Mustard/p/8097451.html
Copyright © 2011-2022 走看看