希尔排序java代码
希尔排序是一种高效的不稳定排序算法,它是插入排序的改进版本。希尔排序通过将数组分成多个子序列来进行排序,然后逐步缩小子序列的间隔,最终将整个数组排序。
javapublic class ShellSort {
public static void shellSort(int[] arr) {
int n = arr.length;
// 初始的间隔取值为数组长度的一半,然后逐步减小间隔
for (int gap = n / 2; gap > 0; gap /= 2) {
// 在每个间隔内进行插入排序
for (int i = gap; i < n; i++) {
int temp = arr[i];
int j;
// 将当前元素插入到合适的位置
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
arr[j] = arr[j - gap];
}
arr[j] = temp;
}
}
}
public static void main(String[] args) {
int[] arr = {12, 34, 54, 2, 3};
System.out.println("原始数组:");
for (int num : arr) {
System.out.print(num + " ");
}
shellSort(arr);
System.out.println("\n排序后的数组:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
上述代码定义了一个 shellSort
方法,用于对整数数组进行希尔排序。在 main
方法中,我们可以看到如何使用这个排序算法对一个数组进行排序。希尔排序的核心思想是通过逐步缩小间隔,使得元素能够更快地移动到它们最终的位置,从而提高了排序的效率。
首先,我们初始化一个间隔为数组长度的一半,然后在每次迭代中将间隔减半。
在每个间隔下,我们执行插入排序。插入排序的思想是将当前元素插入到已排序的子数组中的合适位置。
在内部插入排序中,我们从数组的第 gap 个元素开始,然后将其与之前间隔 gap 的元素比较,如果前面的元素较大,就将它们交换位置,直到找到合适的插入位置。
重复上述步骤,直到 gap 为 1,此时整个数组将被排序。
希尔排序的时间复杂度取决于间隔序列的选择,最坏情况下为 O(n^2),但通常情况下表现得相当快,比插入排序和选择排序要快得多。希尔排序是一种原地排序算法,适用于中等大小的数据集。