package com.hejiale.arithmetic.sort.bubble;
import java.util.Arrays;
/*
希尔排序和直接插入排序都属于插入排序,但是在直接插入排序当中,存在一个问题,就是待插入元素是一个较小的数的时候,后移的次数明显回
增加,对效率会产生影响
希尔排序是简单插入排序经过改进后的一个更高效的版本,也成为缩小增量排序
*/
public class ShellSort {
public static void main(String[] args) {
int[] arr = {3, 9, -1, 10, 20, 13, 2, 6, 23, -2, -5, 21,-21,11,32,1,65,3,-1,0,-12};
int insertValue = 0;
int insertIndex = 0;
int count =0;
/*
希尔排序的核心思想就是:从部分有序逐步推进到整体有序,我们会设置一个步长,通过该步长,将数组分成一个个小组,
然后对各个小组进行直接插入排序,之后步长会逐渐变小直到步长=1,而各个小组的元素数量逐渐变多,直到最后融合成为
一个小组
所以,我们通过一个for循环,设置内层循环的步长
而内层包含的就是直接插入排序的代码,唯一的区别就是注意+步长而不是单纯+1即可
代码实现:
直接插入排序外面套上一个设置步长的for循环即可
*/
/*
一般设置初始步长为arr.length/2,通过for循环可知,外层for循环的遍历趟数为log2N,N为数组长度
*/
for (int d = arr.length / 2; d >= 1; d = d / 2) {//设置每次内循环的步长
for (int i = d; i < arr.length; i++) {//内循环就是直接插入排序,注意步长即可,和之前的直接插入排序没有其他的区别
insertIndex = i - d;//假定插入位
insertValue = arr[i];//待插入元素
while (insertIndex >= 0 && arr[insertIndex] > insertValue) {
arr[insertIndex + d] = arr[insertIndex];
insertIndex = insertIndex - d;
}
arr[insertIndex + d] = insertValue;
}
System.out.println(++count+":"+Arrays.toString(arr));
}
System.out.println("----------------");
System.out.println("最终结果"+Arrays.toString(arr));
}
}
6.4-希尔排序
最新推荐文章于 2022-03-26 08:27:05 发布