1959年Shell发明,说下时间第一个突破 O(n^2^) 的希尔序排序算法,是排序简单插入排序的改进版。它与插入排序的过度和度又多少不同之处在于,它会优先比较距离较远的程希元素。 插入排序的尔排工作原理是通过构建有序序列,对于未排序数据,复杂复杂在已排序序列中从后向前扫描,空间找到相应位置并插入 代码实现: 插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的希尔序插入位置将其插入,并保证已排序区间数据一直有序。排序重复这个过程,过度和度又多少直到未排序区间中元素为空,程希算法结束。尔排 回顾一下上面的复杂复杂插入排序: 所以,如果序列足够乱的云南idc服务商话,时间复杂度为 O(n^2^) 希尔排序又是如何优化的喃? 希尔排序又叫缩小增量排序,就是把数列进行分组(组内不停使用插入排序),直至从宏观上看起来有序,最后插入排序起来就容易了(无须多次移位或交换)。 其中组的数量称为 增量 ,显然的是,增量是不断递减的(直到增量为1) 那我们有是如何进行分组喃? 往往的: 如果一个数列有 8 个元素,我们第一趟的增量是 4 ,第二趟的增量是 2 ,第三趟的增量是 1 。如果一个数列有 18 个元素,我们第一趟的增量是 9 ,服务器托管第二趟的增量是 4 ,第三趟的增量是2 ,第四趟的增量是 1 很明显我们可以用一个序列来表示增量:n/2、(n/2)/2、...、1,每次增量都/2 例如: 排序前: 将该数组看成三组( Math.floor(arr.length/2) ),分别是:[4, 1] , [5, 8] , [7, 3] 第一趟排序: 对三组数据分别进行插入排序,因此我们三个数组得到的结果为:[1, 4] , [5, 8] , [3, 7] 此时数组是这样子的:[1, 4, 5, 8, 3, 7] 第二趟排序: 代码实现: 复杂度分析:插入排序
复杂度分析:
时间复杂度:O(n^2^) 空间复杂度:O(1) 希尔排序