例如有10个数,第一遍按10/2=5的控制增量选择第6个数与第1个数比较,如果第6个数小于第1个数,将第1个数及之后的数后移一位,插入在第1个数前,之后依次将第7个数与第2个数比较……第2遍按5/2=2的控制增量选择第3个数与第1个数比较,方法与第一遍相同,最后一遍按2/2=1的控制增量选择第2个数与第1个数比较,这里方法与插入排序相同。
shell排序原理图
摘自:https://www.cnblogs.com/l199616j/p/10740165.html
//希尔排序
public class SortDemo {
public static void main(String[] args) {
int arr[]=new int[] {45,23,6,3,10,2,1,7,9,12};
ShellSort(arr);
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");//排序后的数字之间带空格输出
}
}
public static void ShellSort(int[] arr) {
int temp;
//控制增量序列,增量序列为1时循环最后一次
for(int i=arr.length/2;i>0;i/=2) {
//根据增量序列,找到每组比较序列的最后一个数的位置
for(int j=i;j<arr.length;j++) {
//根据该比较序列的最后一个数的位置,依次向前执行插入序列
for(int k=j-i;k>=0;k-=i) {
if(arr[k]>arr[k+1]) {
temp=arr[k];
arr[k]=arr[k+i];
arr[k+i]=temp;
}
}
}
}
}
}