javascript实现排序算法(五)

在上一篇博客中,介绍了插入排序的第一种,直接插入排序。再加上前面介绍过的快速排序,冒泡排序和简单选择排序。这四种排序可以不太严谨的定义为八种排序算法中的较简单的排序算法,接下来就要介绍的就是比较复杂的排序算法,所谓的复杂其实指的就是算法的思想上,实现的逻辑上要复杂一些。但是万变不离其宗,大量的代码也许换来的仅仅是很小的效率的提升,但是千里之堤毁于蚁穴,往往是这些小小的细节会赶走大量的用户,这个损失是不可估量的。又说跑题了,回到正题继续介绍今天的主角:希尔排序。

可能大家在看到之前几个排序算法的时候,通过它名字就可以比较形象的猜出这个排序算法的主要特征,甚至是核心的思想。但是今天要介绍的是八大排序算法中唯一一个以发明者的名字命名的排序算法。在物理学,数学中,以科学家名字命名的公式,定义真的是数不胜数,就牛顿牛老师的名字在我学过的知识中就出现了五六次,力的单位牛顿;牛顿一二三定律;牛顿莱布尼茨方程等等。但是可能大家可能没有注意,在计算机领域中,以大师的人名命名的算法包括发明真的是少之又少。“约翰·阿塔那索夫”这个人名可能很多人甚至是同行们都很陌生,简单的介绍一下,这个人是第一个发明现代电子计算机的人,也被成为“电子计算机之父”。我觉得约翰·阿塔那索夫教授所做出的贡献绝对应该和爱迪生,牛顿,瓦特等大师一样被人们牢记,但是甚至对他的名字大家都知之甚少。直到前几年,模仿游戏那部电影上映才让大家认识了“计算机之父”图灵的故事,我觉得这个现象真的很让我困惑。也许甚至是那样伟大的科学家灵魂里也都或多或少具有着一个程序员低调不善言辞的性格吧。

希尔排序,是由Donald Shell于1959年提出的。它作为插入排序的一种,对直接插入排序进行了很大的优化,由于直接插入排序在每次和之前的元素进行比较的时候如果符合条件就要进行插入操作,这样做,如果这样会造成较远的元素需要很多次的无用交换才能放到正确的位置,这样的效率是很低的。 希尔排序会首先比较较远的元素,这样可以使离正确位置很远的元素很快的回到合适的位置。可能有人会问,这不是多此一举吗,正常执行直接插入排序就好了,还多整一步。关于这个疑惑,我举一个简单例子,大家应该就能理解这一步的巧妙之处了。新生报到的时候大家互相不认识,排成一列站队的时候也是高矮胖瘦,参差不齐。这个时候的队列就很像待排序的数组。这个时候老师来了,小个在前大个在后排队,这个时候,比如说队尾站的恰巧是个字很小的同学,如果按直接插入排序的思想的逻辑,老师会从前到后,依次进行排序,当遍历到队尾的时候才会对他进行排序,如果队伍20个人,他就要移动二十次。但是在正常情况下,老师如果发现队尾有一个或几个小个子,会马上把他们叫到前面,把排头几个大个子调到队尾,这就是希尔排序的巧妙之处。接下来就是这个算法的详细介绍和实现。

首先,这个算法引入了一个新的概念,叫做步长。在希尔排序中需要把整个元素分成N组,而这个步长决定着具体分几组,也就是说,哪个元素和距离他长度+步长的元素为一组。举个例子,一个数组:[5,4,3,2,1],如果步长为3,五个元素步长为3,首先[5,2]一组,[4,1]一组,[3]一组。而分组之后组内进行直接插入排序。组内的元素变为:[2,5],[1,4],[3]。然很关键,将元素复位,[2,1,3,5,4]。然后把步长设为2,[2,3,4]一组,[1,5]一组。最后,将步长设为1的时候,就是我们熟悉的直接插入排序了,前面的步骤的目的就是将较远的元素通过尽可能少的步骤移动到正确的位置,在最后步长为一的时候执行一次直接插入操作,这时的数组基本上只需要移动很少的次数就能实现最终的排序。这就是希尔排序的全部过程,在执行直接插入排序之前,对整个数组进行优化。接下来进行代码实现。

1、设置步长

var step = 1;
var l = arr.length;
while(step<l/3){h=h*3;}

希尔排序和直接插入排序的区别就是引入了步长的概念,步长如何选择就变得很关键了,关于取步长的算法就完全可以长篇大论的讨论很久。这里就不赘述了,鉴于较小的数据量,这里我取步长为:3,1。如果数据量很大,可以将步长设为5,3, 1或者7, 5, 3, 1.这里关于步长的取法就不多说了。

while(step>=1){
for(var i = step;i < l;i++){
for(var j = i;j >= step && arr[j-step] > arr[j];j = j-step){
var temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
step = Math.floor(step/3);
}
上面这10行代码其实就是希尔排序的核心实现,可能有的人会觉得似曾相识,和直接插入排序有点像啊。没错,当步长step为1的时候,执行的就是直接插入排序。步长大于1的时候对当前元素和距离加上步长的元素进行比较,如果前面的元素大于后面的元素,那么执行交换操作。然后步长减小,直到步长为1,执行直接插入操作。

QQ截图20160614170108.png

这就是希尔排序的全部介绍。感谢阅读。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 在上一篇博客中,介绍了插入排序的第一种,直接插入排序。再加上前面介绍过的快速排序,冒泡排序和简单选择排序。这四种排...
    小熊猫猫阅读 344评论 0 0
  • 某次二面时,面试官问起Js排序问题,吾绞尽脑汁回答了几种,深感算法有很大的问题,所以总计一下! 排序算法说明 (1...
    流浪的先知阅读 1,184评论 0 4
  • Ba la la la ~ 读者朋友们,你们好啊,又到了冷锋时间,话不多说,发车! 1.冒泡排序(Bub...
    王饱饱阅读 1,779评论 0 7
  • 青海湖 柴达木盆底 海塔尔山脉 祁连山脉
    JY_82bd阅读 73评论 0 0
  • nobody dies in virgin life fucks us all 没有人以处女之身死去,因...
    yancyhan阅读 253评论 0 1