希尔排序(Shell)

时间:2023-03-08 17:12:06

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

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

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

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]+" "); }