希尔排序

今天刚刚学习的希尔排序,我理解了很久,这是我根据书中内容和博客文章自己的理解,希望对你有帮助

希尔排序

希尔排序:插入排序优化
首先它把较大的数据集合分割成若干个小组(逻辑上分组),即h序列,然后对每一个小组分别进行插入排序,此时,插入排序所作用的数据量比较小(每一个小组),插入的效率比较高
h序列:按下标相隔距离为h的两个元素组成的一个组,也就是说把下标相差h的俩元素分到一组,h称为增量。
各个h序列进行插入排序形成h有序序列,再将他们整体编织成为一个h有序数组。
之后将增量h缩小,继续划分为若干个h序列后再进行插入排序,是每个分组各自有序。
不断缩小h至1时,此时的数组已经是一个接近有序的数组,此时就是大型数组进行插入排序也是效率很高。
这样的排序过程就转化成为了类似于插入排序但使用不同增量的过程,成为希尔排序

希尔排序不同于前面的三种基础排序,它可以用于大型数组,但还是更适合于中等大小数组(代码量小,时间尚可,不需要额外内存),对于大型数组有更高效的算法

同时这是帮助我理解那篇博客,希望你也能理解。

https://blog.csdn.net/qq_39207948/article/details/80006224

 

因为是插入排序的优化,所以也存在插入排序的交换式和移位式的两种方法,下面为移位式的代码 

Java代码:

//对交换式的希尔排序进行优化->移位法
public static void shellSort2(int[] arr) {
    // 增量gap, 并逐步的缩小增量
    for (int gap = arr.length / 2; gap > 0; gap /= 2) {
    // 从第gap 个元素,逐个对其所在的组进行直接插入排序
        for (int i = gap; i < arr.length; i++) {
            int j = i;
            int temp = arr[j];
            if (arr[j] < arr[j - gap]) {
                while (j - gap >= 0 && temp < arr[j - gap]) {
                    //移动
                    arr[j] = arr[j-gap];
                    j -= gap;
               }
                //当退出while 后,就给temp 找到插入的位置
                arr[j] = temp;
            }
        }
    }
}                    

 

posted @ 2020-09-25 15:16  Jancy丶  阅读(112)  评论(0)    收藏  举报