• 插入排序-直接插入排序、希尔排序


    插入排序是一类借助'插入'进行排序的算法,主要思想:每次将一个待排序的记录按其关键码大小插入到一个已经排好序的有序序列中,直到全部记录排好序。

    一、直接插入排序

    直接插入排序是插入排序最简单的算法,类似于玩纸牌时整理手中纸牌的过程。基本思想:依次将待排序序列中的每一个记录插入到一个已经排好序的序列中,直到全部记录都排好。代码如下:

    /*插入排序*/
    function sort(arr) {
        var len=arr.length,temp=0,i,j;
        arr.unshift(temp);
        for(i=2;i<=len;i++){
             arr[0]=arr[i];
             for(j=i-1;arr[0]<arr[j];j--){
                  arr[j+1]=arr[j];
             }
    
             /*j=i-1;
             while(arr[0]<arr[j]){
                  arr[j+1]=arr[j]; 
                  j--;                     
             }*/
            
             arr[j+1]=arr[0];                        
        }
        arr.shift(arr[0]);
        return arr;
    }
    console.log(sort([5, 100, 6, 3, -12]));

    效率:

    时间复杂度:最好:O(n),最坏:O(n^2),平均:O(n^2)。

    空间复杂度:O(1)。

    稳定性:稳定

    直接插入排序算法简单,容易实现,当序列中的记录基本有序或者待排序记录较少时,它是最佳的排序方法。但是,当待排序的记录个数较多时,大量的比较和移动操作使得效率很低。

    二、希尔排序

    希尔排序是对直接插入排序的改进,基本思想:先将整个待排序记录序列分割成若干个子序列,在子序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。代码如下:

     1 function shellSort(arr){
     2     var length=arr.length;
     3     var temp,d;
     4     for(d=Math.floor(length/2);d>=1;d=Math.floor(d/2)){//以增量d进行直接插入排序
     5         for(var i=d;i<length;i++){
     6             temp=arr[i];//暂存被插入的记录
     7             for(var j=i-d;j>=0&&temp<arr[j];j=j-d){
     8                 arr[j+d]=arr[j];//记录后移d个位置
     9             }
    10             arr[j+d]=temp;
    11         }
    12     }    
    13     return arr;
    14 }
    15 shellSort([59,20,17,36,98,14,23,83,13,28]);

    效率:

    时间复杂度:最好:O(nlog2n)~O(n^2),最坏:O(n^1.3),平均:O(n^2)。

    空间复杂度:O(1)。

    稳定性:不稳定

  • 相关阅读:
    《骆驼祥子》
    《基督山伯爵》
    JDeveloper 假死问题
    JSP代码执行顺序
    Ajax简单案例(实现提交值到服务器值不刷新页面)
    JS和JSP之间值传递
    如何更好的编码
    Telnet 便捷执行脚本
    MyBatis 缓存
    MyBatis 中传递多个参数的 4 种方式
  • 原文地址:https://www.cnblogs.com/Iona/p/4734506.html
Copyright © 2020-2023  润新知