插入排序(Insertion Sort):
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置插入。
算法描述:
一般来说,插入排序都采用 in-place在数组上实现,具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描。
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3 ,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤 2 ~ 5。
function insertionSort(arr) {
var len = arr.length;
var preIndex, current;
for (var i = 1; i < len; i++) {
preIndex = i - 1;
current = arr[i]; //待排序的元素
while (preIndex >= 0 && arr[preIndex] > current) { //当已排序的元素大于
arr[preIndex + 1] = arr[preIndex];
preIndex--;
}
arr[preIndex + 1] = current;
}
return arr;
}
插入算法复杂度分析:
从空间上来看,它只需要一个记录的辅助空间,因此关键是看它的时间复杂度。
当最好的情况,也就是要排序的表本身是有序的,把么我们比较次数,其实就是待排序的数直接与前一个数比较,发现满足条件,因此没有移动的记录,时间复杂度为 O(n)。
当最坏的情况,即待排序表是逆序的情况,此时需要比较1+ 2 + 3 + …… + n-1 ,而最后的移动次数也达到最大值 1 + 2 + 3 + …… + n-1。
如果排序记录是随机的,那么根据概率相同的原则,平均边角和移动次数约为 n2 / 4 ,因此,我们得出插入排序算法时间复杂度为 O (n2),同样的 O(n2)时间复杂度,直接插入排序法比冒泡和简单选择排序的性能要好一些。