希尔排序
作者:互联网
import java.util.Random;
public class ShellSort {
private ShellSort() {}
public static <E extends Comparable<E>> void Sort(E[] arr) {
// 每次希尔排序的间隔
int h = arr.length / 2;
while (h >= 1) {
// 依次遍历每个元素(从每个子数组的第二个元素开始)
for (int i = h; i < arr.length; i++) {
// 记录待插入的元素
E temp = arr[i];
int j = 0;
// 如果待插入元素小于当前索引元素 则将当前索引元素向后移动
for (j = i - h; j >= 0 && temp.compareTo(arr[j]) < 0 ; j -= h) {
arr[j + h] = arr[j];
}
// 将待插入元素插入最后移动的元素的位置
arr[j + h] = temp;
}
// 间隔减半
h /= 2;
}
}
public static void main(String[] args) {
int n = 100000;
Random rnd = new Random();
Integer[] arr = new Integer[n];
for (int i = 0; i < n; i++) {
arr[i] = rnd.nextInt(n);
}
// 记录排序消耗的时间
long startTime = System.nanoTime();
ShellSort.Sort(arr);
long endTime = System.nanoTime();
// 检查是否排序正确(从小到大排序) 如果不正确则抛出异常
for (int i = 0; i + 1 < n; i++) {
if (arr[i] > arr[i + 1])
throw new IllegalArgumentException("sort failed");
}
// 输出排序消耗时间
double time = (endTime - startTime) / 1000000000.0;
System.out.println("ShellSort: arr.length = " + n + " time = " + time + "s");
}
}
标签:arr,int,元素,length,希尔,排序,ShellSort 来源: https://blog.csdn.net/woaichikaoya/article/details/116405934