排序-1-插入排序

插入排序

插入排序的设计初衷是往有序的数组中快速插入一个新的元素。它的算法思想是:把要排序的数组分为了两个部分, 一部分是数组的全部元素(除去待插入的元素), 另一部分是待插入的元素; 先将第一部分排序完成, 然后再插入这个元素. 其中第一部分的排序也是通过再次拆分为两部分来进行的.

基本思想:

直接插入排序的基本思想是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过为止。

算法描述:

    1. 从第一个元素开始,该元素可以认为已经被排序
    1. 取出下一个元素,在已经排序的元素序列中从后向前扫描
    1. 如果该元素(已排序)大于新元素,将该元素移到下一位置
    1. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
    1. 将新元素插入到该位置后
    1. 重复步骤2~5

    //------------交换次数较多的写法-----------------
    function  anotherInsetSort(arr){
     for (var i=1;i<arr.length;i++) {//n个元素要比较n-1次
         for (var j=i;j>0;j--) {//j之前的元素时已经排序的
             if(arr[j]>=arr[j-1])//从后往前扫描,新元素大于等于已经排序元素的最后一个元素时进入下一次循环,继续扫描
                 break;
                 var temp=arr[j];//否则交换
                 arr[j]=arr[j-1];
                 arr[j-1]=temp;
             
             console.log(arr.toString())//打印出当前排序的数组
         }
     }
    }
    
    //------------优化后的写法-----------------
    function insertSort(arr){
     for (var i=1;i<arr.length;i++) {//用来控制显示比较的次数,也就是未排序的数
         var temp=arr[i];//在这里先取得当前要比较的值,可减少交换的次数
         for (var j=i;j>=0;j--) {//和已经排序的数组比较,实际上数组的排序是在这个循环里完成的
             if(arr[j-1]>temp){
                 arr[j]=arr[j-1];
             }
             else{
                 arr[j]=temp;//当前位置就是新插入的元素
                 console.log(arr.toString())//打印出当前排序的数组
                 break;
         }
         }
     }
    }
    
平均时间复杂度 最好情况 最坏情况 空间复杂度
O(n²) O(n) O(n²) O(1)

Tips: 由于直接插入排序每次只移动一个元素的位, 并不会改变值相同的元素之间的排序, 因此它是一种稳定排序。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 3,892评论 0 0
  • Ba la la la ~ 读者朋友们,你们好啊,又到了冷锋时间,话不多说,发车! 1.冒泡排序(Bub...
    王饱饱阅读 5,769评论 0 7
  • Python 中的模块 模块是一个包含 Python 代码的 .py 文件模块既可以被导入到 Python 的交互...
    大墩子丶阅读 2,635评论 0 1
  • 【商品一】生产日期:20150113 前几天上着课,我看着老师头上所剩不多的毛发,就那么0.01秒什么都感受不到,...
    孤的猫腻阅读 1,254评论 0 0
  • 4 死性不改 “我说的话,你从没放在心上对不?成天在外面游荡,无所事事,你说,哪个好人家女儿会做这等事?你败坏自己...
    绝版大米阅读 2,405评论 0 0