1 概述
插入排序的基本方法是:每一步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。
那么可以选择不同的方法在已经排好序的数据表中寻找插入位置。根据查找方法不同,有多种插入排序方法,主要分两种:第一种:直接插入排序;第二种:二分法插入排序。
2. 直接插入排序
插入排序的基本思想如下:当准备插入第i个数时,前面的 i-1 个数已经排好序了,那么这时候只需要把这第 i 个数插到前面 i-1 个数的合适位置,然后此时就变成前面 i 个数已经排好序,接下来插入第 i+1个数,直到结束,思路如下:
1)假设现有一数组arr=[8,6,17,84,25,6,14,10];
2)每一趟的过程如下
3)最终,经过arr.length-1趟,就能够把数组给排好序
那么这里面的关键点就在于,如何把第 i 个数正确地插入到前面的i-1个已经排好序的序列中;其实也很简单,只需要在前面的i-1个序列中,从后往前依次遍历,如果遍历到的数比第i个数大,那么就往后面挪一个位置,发现遍历到的数比第i个数小,那么就把第 i 个数直接放到这一个位置就可以了!
var arr=[8,6,17,12,84,25,6,14,10];
var len=arr.length;
for(var i=1;i<len;i++){
var temp=arr[i];
for(var j=i-1; j>=0 && temp<arr[j]; j--){ // 第i个数小于前面的数 如果是降序,那么就直接大于
// 那么依次往后挪动一个位置
arr[j+1]=arr[j];
}
// 这时候能跳出循环的话,要么已经到了第一个位置了要么就是这个数已经大于它前面的数了
// 所以把这个数直接放这个位置就可以了
arr[j+1]=temp;
}
console.log(arr);
最好的状况下时间复杂度为O(n),最差的状况O(n^2),平均为O(nlogn).
3. 二分法插入排序
其实原理是一样的,不同的是在直接插入排序中是直接遍历去找到合适的位置并且插入的;那么二分法插入排序其实就是对这一过程进行了优化,利用二分法找到合适的位置;
var arr=[8,6,17,12,84,25,6,14,10];
var len=arr.length;
for(var i=1;i<len;i++){
var temp=arr[i];
var high=i-1;
var low=0;
var mid;
while(low<=high){
mid=parseInt((high+low)/2);
if(temp>arr[mid]){
low=mid+1;
}else{
high=mid-1;
}
}
for(var j=i-1; j>=low; j--){ // 第i个数大于前面的第i-1个数
// 那么依次往后挪动一个位置
arr[j+1]=arr[j];
}
arr[low]=temp;
}
console.log(arr);