博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从零开始学算法 - 希尔排序
阅读量:5291 次
发布时间:2019-06-14

本文共 1332 字,大约阅读时间需要 4 分钟。

希尔排序是插入排序的升级版:

需求:插入排序对于小规模数据来说很好用,但随着数据规模增大,全部遍历并进行插入变得不再现实。

思路:对大规模的数据进行分组,在每个分组内进行插入排序,试图减小每次参与排序的数据规模。

 

用最常用的分组模式 h = 3h +1 来解释一下希尔排序的过程:

假设有20个待排序的数字,用 h = 3h +1 的方式来分组。

用公式确定分组数量大小:

初始值:h = 1

第一趟:h = 3h + 1 = 4

第二趟:h = 3h + 1 = 13

第三趟:h = 3h + 1 = 40(超长,不采纳)

用13作为间隔,进行第一次遍历,并对参与进来的数字进行插入排序:

初始数组:[34, 10, 22, 91, 99, 70, 25, 82, 51, 36, 95, 65, 12, 98, 3, 93, 91, 20, 73, 58]

初次分组:[34, 10, 22, 91, 99, 70, 25, 82, 51, 36, 95, 65, 12, 98, 3, 93, 91, 20, 73, 58]

分组交换:[34, 3, 22, 91, 20, 70, 25, 82, 51, 36, 95, 65, 12, 98, 10, 93, 91, 99, 73, 58]

用4作为间隔,进行第二次遍历,并对参与进来的数字进行插入排序:

初始数组:[34, 3, 22, 91, 20, 70, 25, 82, 51, 36, 95, 65, 12, 98, 10, 93, 91, 99, 73, 58]

二次分组:[34, 3, 22, 91, 20, 70, 25, 82, 51, 36, 95, 65, 12, 98, 10, 93, 91, 99, 73, 58]

分组交换:[12, 3, 10, 58, 20, 36, 22, 65, 34, 70, 25, 82, 51, 98, 73, 91, 91, 99, 95, 93]

最后用1作为间隔,得到最终的结果:

最后交换:[3, 10, 12, 20, 22, 25, 34, 36, 51, 58, 65, 70, 73, 82, 91, 91, 93, 95, 98, 99]

 

将上述过程翻译成代码:

function shellSort(arr){  //根据公式获取随机数列  var h = 1;  var len = arr.length;  while(h
0;h = Math.floor(h/3)){    var preIndex,current;    for(var i=h;i
= 0 && arr[preIndex]>current){        arr[preIndex+h] = arr[preIndex];        preIndex -= h;       }      arr[preIndex+h] = current;    }  } }

 

转载于:https://www.cnblogs.com/lynshxs/p/9850958.html

你可能感兴趣的文章
团队作业
查看>>
数据持久化时的小bug
查看>>
mysql中key 、primary key 、unique key 与index区别
查看>>
bzoj2257
查看>>
Linux查看文件编码格式及文件编码转换<转>
查看>>
Leetcode: Find Leaves of Binary Tree
查看>>
Vue 模板解释
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>
将多张图片和文字合成一张图片
查看>>
自己动手写ORM(01):解析表达式树生成Sql碎片
查看>>
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
百度Ueditor编辑器的Html模式自动替换样式的解决方法
查看>>
变量提升
查看>>
线性表可用顺序表或链表存储的优缺点
查看>>
在现有的mysql主从基础上,搭建mycat实现数据的读写分离
查看>>
opencv安装配置
查看>>
JAVA-初步认识-第六章-面向对象(举例)
查看>>
js合并数组
查看>>
cNoteSetCursor_命令窗口光标设置
查看>>