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