介绍
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。
基本思想
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止
图解
代码实现
第一次排序(步长为5)
public static int[] shellSort(int [] arr){
int temp = 0; // 辅助变量
for (int i = 5; i < arr.length; i++){ // 因为是第一轮循环,所以将10个数据分为了5组
for (int j = i - 5; j >= 0; j-=5){ // 遍历各组的数据,步长为5
if (arr[j] > arr[j+5]){
temp = arr[j];
arr[j] = arr[j+5];
arr[j+5] = temp;
}
}
}
}
System.out.println("第一轮排序结果:"+ Arrays.toString(arr));
第一轮排序后的结果为
第二次排序(步长为2)
for (int i = 2; i < arr.length;i++){
for (int j = i - 2;j>=0;j-=2){
if (arr[j] > arr[j+2]){
temp = arr[j];
arr[j] = arr[j+2];
arr[j+2] = temp;
}
}
}
System.out.println("第二轮排序结果:"+ Arrays.toString(arr));
第二轮排序后的结果为
第三轮排序(步长为1)
// 第三轮
for (int i = 1; i < arr.length;i++){
for (int j = i - 1;j>=0;j-=1){
if (arr[j] > arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println("第三轮排序结果:"+ Arrays.toString(arr));
第三轮排序后的结果为
将代码进行汇总优化
for (int z = arr.length/2;z>0;z=z/2){ // 步长
for (int i = z; i < arr.length; i++){ // 因为是第一轮循环,所以将10个数据分为了5组
for (int j = i - z; j >= 0; j-=z){ // 遍历各组的数据,步长为5
if (arr[j] > arr[j+z]){
temp = arr[j];
arr[j] = arr[j+z];
arr[j+z] = temp;
}
}
}
}
当前的希尔排序时采用的是交换法
测试100000条数据需要多少时间
int arr[] = new int[100000];
for (int i = 0; i < arr.length; i++){
arr[i] = (int)(Math.random()*100000);
}
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = simpleDateFormat.format(date);
System.out.println("开始前的时间为:"+now);
shellSort(arr);
Date date1 = new Date();
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String after = simpleDateFormat.format(date1);
System.out.println("结束后的时间为:"+after);