插入排序是一类借助'插入'进行排序的算法,主要思想:每次将一个待排序的记录按其关键码大小插入到一个已经排好序的有序序列中,直到全部记录排好序。
一、直接插入排序
直接插入排序是插入排序最简单的算法,类似于玩纸牌时整理手中纸牌的过程。基本思想:依次将待排序序列中的每一个记录插入到一个已经排好序的序列中,直到全部记录都排好。代码如下:
/*插入排序*/ 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)。
稳定性:不稳定