插入排序
插入排序的设计初衷是往有序的数组中快速插入一个新的元素。它的算法思想是:把要排序的数组分为了两个部分, 一部分是数组的全部元素(除去待插入的元素), 另一部分是待插入的元素; 先将第一部分排序完成, 然后再插入这个元素. 其中第一部分的排序也是通过再次拆分为两部分来进行的.
基本思想:
直接插入排序的基本思想是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过为止。
算法描述:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
-
- 重复步骤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: 由于直接插入排序每次只移动一个元素的位, 并不会改变值相同的元素之间的排序, 因此它是一种稳定排序。
