• 希尔排序(Shell)


    希尔排序的实质就是分组插入排序,该方法又称缩小增量排序。

    该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

    就是直接插入排序的升级版,可以和直接插入排序进行对比,就比较容易理解。

    1.固定增量r,每次除2

    /*
    	 * shell排序
    	 * 希尔排序 直接插入排序的升级版*/
    	static void shellSort(int[] a){
    		int j,i,h;
    		int r,temp;
    		int x=0;
    		for(r= a.length/2;r>=1;r/=2){
    			for(i =r ;i<a.length;i++){
    				temp = a[i];
    				j = i-r;
    				while(j>=0 && temp<a[j]){
    					a[j+r]=a[j];
    					j -= r;
    				}
    				a[j+r]=temp;
    				
    			}
    			x++;
    			System.out.println("第"+x+"步排序结果:");
    			for(h = 0;h<a.length;h++){
    				System.out.print(""+a[h]+" ");
    			}
    			System.out.println("
    ");
    		}
    	}
    

      2.自定义增量数组:int[] dlta= new int[]{3,2,1},这个数组自定义,数量视实际情况而定。

    static void ShellInsert(int[] a,int dk){
    		int i,j;
    		for(i = dk+1;i<a.length;i++){
    			if(a[i]<a[i-dk]){  //需要插入
    				a[0]=a[i];
    				for(j = i-dk;j>0&&a[0]<a[j];j-=dk)
    					a[j+dk]=a[j];     //记录后移寻找插入位置
    				a[j+dk]=a[0];
    				
    			}
    			
    		}
    		
    	}
    	 static void ShellSort(int a[],int dlta[],int t){
    		 //按增量序列dlta[0。。t-1]对顺序表L作希尔排序
    		 
    		 for(int k=0;k<t;k++)
    			 ShellInsert(a,dlta[k]);
    	 }
    
         public static void main(String[] args){
    
       int[] array  = new int[]{22,55,45,18,40,8,36};
    		int[] dlta= new int[]{3,2,1};
    		//shellSort(array);
    		ShellSort(array,dlta,3);
        for(int i=0;i<array.length;i++)
    			System.out.print(array[i]+" ");
    
      }
    

      

  • 相关阅读:
    jQuery文档处理--事件--动画
    jQuery选择器
    jQuery入门
    正则表达式
    Bootstrap 的基本实现
    JavaScript--DOM
    JavaScript--BOM
    JavaScript--ECMAScript
    CSS3动画
    CSS3新增的选择器
  • 原文地址:https://www.cnblogs.com/jycboy/p/5450714.html
Copyright © 2020-2023  润新知