希尔排序(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]+" ");

  }

  

原文地址:https://www.cnblogs.com/jycboy/p/5450714.html