JavaScript实现希尔排序及优化

Posted 十九万里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript实现希尔排序及优化相关的知识,希望对你有一定的参考价值。

第一个突破O(n2)的排序算法,是简单插入的改进版,会优先比较远距离的元素,希尔排序又叫缩小增量排序。

希尔排序原理: 吧数组按下标的一定增量进行分组。对每组使用直接插入排序算法排序。随着增量的逐渐减少。每组包含的元素越来越多,当增量减到1的时候,整个数组恰好被分成一组,算法便终止了。

描述:

选择一个增量序列: t1 t2 t3 … tk t1>t2>…tk=1
按增量序列个数k 对序列进行k趟排序
每趟排序,根据对应的增量ti 将排序序列分割成若干长度为m的子序列,分别对各子序列进行直接插入排序,仅增量因子为1时,整个序列作为一个表来处理,表长度几位整个序列的长度。

代码实现:

// 希尔排序
function hillSort(array){
    let length = array.length;
    // 如果不是数组或者数组长度小于1 直接返回,不需要排序
    if(!Array.isArray(array) || length <= 1)return;
    //第一层确定增量的大小,每次增量的大小减半
    for (let gap = parseInt(length >> 1);gap >= 1; gap = parseInt(gap >> 1))
    {
        // 对每个分组使用插入排序,相当于将插入排序的1换成了 n
        for (let i = gap; i< length ;i++){
            let temp = array[i];
            let j = i;
            while (j- gap >= 0 && array[j - gap] > temp){
                array [j] = array[j - gap];
                j -= gap;
            }
            array[j] = temp;
        }
    }
    return array;
}

图解排序算法:

希尔排序是利用了插入排序对于已排序序列排列效果最好的特点,在一开始序列为无序序列时,将序列分为多个小组进行基数排序,由于排数小,每次基数排序的效果较好, 然后在逐步增大增量, 将分组的大小增大。由于每一次是基于排序后的结果。所以每一次都可以看做一个基本排列的序列,所以能够最大化插入排序的优点。
简单来说: 由于开始时每组只有很少整数,所以排序很快,之后虽然每组的数量越来越多,但是由于数越来越有序,所以排序也很快

以上是关于JavaScript实现希尔排序及优化的主要内容,如果未能解决你的问题,请参考以下文章

插入排序(直接插入排序折半插入排序希尔排序的算法思想及代码实现)

JavaScript希尔排序

希尔排序

算法-java代码实现希尔排序

java实现希尔排序算法

java实现希尔排序算法