Shell Sort 希尔排序
希尔排序(Shell Sort)是一种改进的插入排序算法,其思路如下:首先,选择一个增量序列(通常为n/2,n为数组长度)来划分数组。按照增量序列的步长,对子序列进行插入排序。逐渐缩小增量序列的步长,重复上述步骤,直到增量序列为1,即对整个数组进行最后一次插入排序。
以下是希尔排序的具体步骤:
- 初始化增量序列,通常为数组长度的一半,并将其逐渐缩小为1。
- 对于每个增量,从增量位置开始,对子序列进行插入排序。
- 重复步骤2,直到增量为1,即对整个数组进行最后一次插入排序。
以下是希尔排序的示例代码:
public class Sort {
public static void shellSort(int[] arr) {
int n = arr.length;
int gap = n / 2;
while (gap > 0) {
for (int i = gap; i < n; i++) {
int temp = arr[i];
int j = i;
while (j >= gap && arr[j - gap] > temp) {
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
gap /= 2;
}
}
public static void main(String[] args) {
int[] array = {5, 2, 8, 12, 1, 6};
shellSort(array);
System.out.println("排序结果:");
for (int num : array) {
System.out.print(num + " ");
}
}
}
希尔排序的时间复杂度取决于增量序列的选择,最坏情况下为O(n^2),最好情况下可达到O(n log n)。
希尔排序的空间复杂度为O(1),因为算法只需要常数级的额外空间来存储临时变量和增量值。
希尔排序相较于简单插入排序,在大规模数据集上表现更优,但并不如快速排序或归并排序等高级排序算法效率高。