直接插入排序——排序算法

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangpaopao0609

看星空看日落不如看我的眼眸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值