概述
希尔排序是一种基于插入排序的快速排序算法。如果还未掌握插入排序的可以参考我的文章:https://blog.csdn.net/weixin_45434953/article/details/104240071
对于大规模的乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组的一端移动到另一端。
希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。希尔排序的思想是使数组中任意像个为h的元素都是有序的。这样的数组被称为h有序数组。
想要简单明了描述希尔排序有点难(我也想了很久),建议不太明白的同学直接去看这两个希尔排序可视化的视频:(建议先看第一个再看第二个,第一个更直观,第二个贴近代码)
https://www.bilibili.com/video/av17062242?from=search&seid=16178959150156651996
https://www.bilibili.com/video/av78643596?from=search&seid=16178959150156651996
代码展示
package Sort;
import java.util.*;
public class Shell_Sort {
public static void sort(Comparable[] a) {
int N = a.length;//获取输入数组长度
int h = 1;//增量h
while (h < N/3)
h = 3*h + 1;
while ( h >= 1 ) {
//将数组变为h有序
for ( int i = h; i<N; i++) {
//将a[i]插入到a[i-h],a[i-2h],a[i-3h]...之中
//回溯操作,将a[i]插入到h有序数组中的正确位置
for (int j = i; j>=h && a[j].compareTo(a[j-h])<0; j-=h ) {
Comparable t = a[j];
a[j] = a[j-h];
a[j-h] = t;
}
}
h = h/3;
}
}
//用于打印展示数组的方法
private static void show(Comparable[] a) {
for (int i = 0; i<a.length; i++)
System.out.print(a[i]+" ");
System.out.println();
}
//用例
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
String in = reader.nextLine();
String[] a = in.split(" ");
sort(a);//调用上面的选择排序方法
show(a);
}
}
输入输出结果:
输入
S H E L L S O R T E X A M P L E
输出
A E E E H L L L M O P R S S T X