zoukankan      html  css  js  c++  java
  • 【JavaScript算法】---希尔排序

    一、什么是希尔排序

    希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。
     
    思路:
         希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止
     
    逻辑:
        在希尔排序中最重要的是分组,我们先找到一个间隔,每隔一定的间隔将这些数字排位一组,
        假设有这样一个数组 [9,1,2,5,7,4,8,6,3,5] ;我们每隔5个为一组。那么这个数组被我们分成了以下几组
        第一组:9    4
        第二组:1   8
        第三组:2   6
        第四组:5   3
        第五组:7   5
        
        分组完毕后我们在每隔组的组内进行排序  
     
        第一组: 4   9
        第二组:1    8
        第三组    2    6
        第四组    3    5
        第五组    5    7
     
        排序后我们在将这个数组重新设间隔重新进行排序(下一次的间隔减半)  2个为一组
        [4,1,2,3,5,9,8,6,5,7]
        
         第一组:4  2  5  8   5   ==》组内排序   2 4 5 5 8
         第二组:1  3  9  6   7   ==》组内排序   1 3 6 7 9
         
        2  1  4  3  5  6  5  7  8  9
        
     
        排序后我们在将这个数组重新设间隔重新进行排序(下一次的间隔减半)  1个为一组最后一次也就是两两比较
        
        1  2  3  4  5   5  6  7  8  9
        
     
    注意:间隔在希尔排序中一般是没有特别的规定,通常情况下是数组长度的一半
     
     
    二、代码
    var arr = [2,5,1,9,0]
    //算间隔
    var len = Math.floor(arr.length/2)
    while(len>0){
        for(var i=len;i<arr.length;i++){
            var temp = arr[i];
            for(var j=i-len;j>=0&&temp<arr[j];j=j-len){
                arr[j+len] = arr[j]
            }
            arr[j+len] = temp;
        }
        len = Math.floor(len/2)
    }
  • 相关阅读:
    Android开发之动态设置字体的样式和粗细
    Android开发之炫酷MD风格
    Android开发之自定义Dialog简单实现
    Android开发之自定义Toast(带详细注释)
    【Android优化篇】提升Activity加载速度的方法
    android使用Pull解析来自服务器的xml文件时出现错误以及解决方案
    Image augmentation for machine learning experiments
    LibreCAD
    C++ library to read and write DXF/DWG files
    DXF-Viewer
  • 原文地址:https://www.cnblogs.com/nanianqiming/p/9541647.html
Copyright © 2011-2022 走看看