希尔排序是插入排序的一种。通过设置固定的间隔,将数组进行分组,然后在组内进行插入排序,将间隔逐渐缩小,进行重新分组,重新插入排序。
import java.util.Scanner;
public class ShellSort {
public static void main(String []args){
int n;
Scanner s=new Scanner(System.in);
n=s.nextInt();
int[] a=new int[n];
for(int i=0;i<n;i++){
a[i]=s.nextInt();
}
int gap;
System.out.println("交换前:");
for(int i=0;i<n;i++){
System.out.print(a[i]+" ");
}
System.out.println();
for(gap=n/2;gap>=1;gap/=2){//每次将gap缩小1/2
// System.out.println("gap="+gap);
for(int j=gap;j<n;j++){//从第gap个元素开始,在组内进行插入排序
int temp=a[j];
int k=j-gap;
while(k>=0&&a[k]<temp){
a[k+gap]=a[k];
k-=gap;
}
a[k+gap]=temp;
}
// System.out.println("交换后:");
// for(int i=0;i<n;i++){
// System.out.print(a[i]+" ");
// }
// System.out.println();
}
for(int i=0;i<n;i++){
System.out.print(a[i]+" ");
}
}
}
希尔排序最重要的是gap的最初取值。它将影响算法的时间复杂度。