看动画理解
【数据结构】八大排序(超详解+附动图+源码)_数据结构排序-CSDN博客
一 基本思想
先选定一个整数gap,把待排序文件中所有记录分成gap个组,所有距离为gap的记录分在同一组内,并对每一组内的元素进行排序。
然后将gap逐渐减小重复上述分组和排序的工作。
当到达gap=1时,所有元素在统一组内排好序。
二 代码实现
java
import java.util.Arrays; // 导入Arrays类,用于数组操作
public class Main {
// 主方法,程序的入口点
public static void main(String[] args) {
// 初始化一个整型数组,包含一些元素
int arr[] = {1, 33, 2, 645, 747, 876, -1, -12345, 9, 10};
// 调用sort1方法对数组进行排序
sort1(arr);
// 使用Arrays.toString方法打印排序后的数组
System.out.println(Arrays.toString(arr));
}
// 定义一个私有静态方法sort1,用于对整型数组进行排序
private static void sort1(int[] arr) {
// 外层循环,控制间隔gap的值
for(int gap = arr.length / 2 ; gap > 0; gap /= 2){
// 内层循环,从gap开始遍历数组
for(int i = gap; i < arr.length; i++){
// 最内层循环,用于比较和交换元素
for(int j = i - gap; j >= 0; j--){
// 如果当前元素比它后面gap位置的元素大,则交换它们
if(arr[j] > arr[j + gap]){
int temp = arr[j];
arr[j] = arr[j + gap];
arr[j + gap] = temp;
}
}
}
}
}
}
三 希尔排序的特性总结
希尔排序是对直接插入排序的优化。
当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。
希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,这里不深究。
时间复杂度O(N^1.5)
空间复杂度O(1)
稳定性:不稳定。