排序-1-插入排序

插入排序

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

基本思想:

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

算法描述:

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

    //------------交换次数较多的写法-----------------
    function  anotherInsetSort(arr){
     for (var i=1;i0;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=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-插入排序)