原理:1.选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组;
2.对分好组的每一组数据完成插入排序;
3.减少增长量h的值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7oSkoD47-1658998078140)(C:\Users\huang\AppData\Roaming\Typora\typora-user-images\image-20220725191117087.png)]
Java代码
public class ShellSort {
public static void main(String[] args) {
Integer[] arr={1,23,5,3,7,4,8,4,7};
shellSort(arr);
System.out.println(Arrays.toString(arr));
}
//排序
public static void shellSort(Comparable[] arr){
//确定增长量的初始值
int h=1;
while (h<arr.length){
h=2*h+1;
}
while (h>=1){
//令i=h 当h的值越小遍历的次数越多
for (int i = h; i <arr.length ; i++) {
//i就相当于要插入的元素和自己组开头的元素比较 如果比他小就交换
for (int j = i; j >=h ; j-=h) {
if (greater(arr[j-h],arr[j])){
swap(arr,j-h,j);
}else {
break;
}
}
}
//减小h的值
h=h/2;
}
}
//比较两个较大的数
public static boolean greater(Comparable v, Comparable w){
return v.compareTo(w)>0;
}
//交换两个数
public static void swap(Comparable[] a,int i,int j){
Comparable temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
a[i]=a[j];
a[j]=temp;
}
}