每天一点算法-希尔排序-(Day6)

简介: 每天一点算法-希尔排序-(Day6)

介绍

今天介绍第二种插入排序——希尔排序,该方法因D.L.Shell于1959年提出而得名,是第一个时间复杂度突破O(n^2)的排序算法,又叫缩小增量排序,在待排序数据量越大,希尔排序直接插入排序的优势就越加明显,但也是前面介绍几种算法中较难理解的一种。算法逻辑(升序为例):

初始时,有一个大小为 10 的无序序列:

1.在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。

2.接下来,按照直接插入排序的方法对每个组进行排序。

在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。

3.按照直接插入排序的方法对每个组进行排序。

4.在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。

5.按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。

希尔排序

例子

假设有一个待排序数组[77, 6, 37, 96, 34, 6, 14], js实现如下(升序):

function shellSort(arr) {
  var len = arr.length,
  temp,
  gap = 1;
  while(gap < len/5) { //动态定义间隔序列
    gap =gap*5+1;
  }
  for (gap; gap > 0; gap = Math.floor(gap/5)) {
    for (var i = gap; i < len; i++) {
      temp = arr[i];
      for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) {
        arr[j+gap] = arr[j];
      }
      arr[j+gap] = temp;
    }
  }
  return arr;
}
sort([77, 6, 37, 96, 34, 6, 14]); // =>[6, 6, 14, 34, 37, 77, 96]

时间复杂度

时间复杂度为O(n^1.3)

感谢阅读!欢迎关注!持续更新中...
相关文章
|
3天前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--希尔排序
数据结构与算法(Java篇)笔记--希尔排序
|
6月前
|
算法 搜索推荐 Shell
Python算法——希尔排序
Python算法——希尔排序
40 0
|
3天前
|
算法 前端开发 搜索推荐
前端算法之希尔排序
前端算法之希尔排序
4 0
|
3天前
|
搜索推荐 算法 Java
sort-06-shell sort 希尔排序算法详解
这是一个关于排序算法的系列文章摘要。文章汇总了各种排序算法,包括冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序以及大文件外部排序。特别地,希尔排序是一种改进的插入排序,通过使用不同的步长对元素进行分组排序,以提高效率。算法最终以较小的步长进行排序,接近线性时间复杂度。文章还提供了Java代码实现,并举例说明了希尔排序的过程。所有内容可在开源项目[https://github.com/houbb/sort](https://github.com/houbb/sort)中找到。
|
3天前
|
人工智能 搜索推荐 Shell
【排序算法】插入排序与希尔排序,你不想知道为什么希尔比插入更快吗?
【排序算法】插入排序与希尔排序,你不想知道为什么希尔比插入更快吗?
|
3天前
|
搜索推荐 算法 Shell
【数据结构与算法】直接插入排序和希尔排序
【数据结构与算法】直接插入排序和希尔排序
|
3天前
|
搜索推荐 测试技术
【排序算法】希尔排序
【排序算法】希尔排序
|
3天前
|
搜索推荐 算法 Shell
【数据结构】八大排序之希尔排序算法
【数据结构】八大排序之希尔排序算法
26 0
|
3天前
|
搜索推荐 算法
【排序算法】一文教你从零学会希尔排序
【排序算法】一文教你从零学会希尔排序
|
3天前
|
存储 算法 搜索推荐
【数据结构与算法】:插入排序与希尔排序
欢迎大家来到初阶数据结构的最后一小节:排序
【数据结构与算法】:插入排序与希尔排序