希尔排序(Shellsort)又称缩小增量法。它的思想和插入排序的思想有一定的关联。插入排序是将整个数组看成一个整体,而希尔排序是将整个数组划分为几大块,先每块分别进行插入排序,再将几个大块拆分为更多的小块,并继续上述的操作,直到拆分到每块都只有一个元素,此时整个数组则排序完成。
排序流程图
排序思想
1.先将整个数组对半拆分,得到两部分数组。
2.对那两部分数组进行插入排序。
3.再将每块进行对半拆分,得到几部分的数组。
4.再次对那几部分的数组进行插入排序。
5.直到每部分都只有一个元素,此时已无法再拆分,则整个数组都排序完成。
排序代码
public static void shellSort(int[] arr){
//首次拆分
int gap = arr.length >> 1;
while (gap > 1){
//进行插入排序
insertSortByGap(arr, gap);
//对每部分进行拆分
gap >>= 1;
}
//此时整个数组已经近乎有序,再次使用插入排序即可有序
insertSort(arr);
}
//此函数为将插入排序中的起始索引1,改为gap
private static void insertSortByGap(int[] arr, int gap) {
for (int i = gap; i < arr.length; i++) {
//对每部分的数组进行插入排序
for (int j = i; j >= gap && arr[j] > arr[j - gap]; j -= gap) {
swap(arr, j, j - gap);
}
}
}