• 排序算法——二分插入排序


    思路

    二分插入排序是插入排序的改进版,思路如下:

    ① 取数组的第一个元素认为已经排好序了

    ② 依次遍历数组中的元素,每次遍历过程中用二分查找找到已排序数组中,最后一个大于当前被遍历元素的位置

    ③ 将当前元素插入②找到的位置

    ④ 遍历完成后排序完成

    前置技能

    二分查找

    在一个有序数组arr中寻找一个数的位置。

    ① 定义一个索引 left=0,right=arr.length-1 ,mid=(left+right)/2向下取整

    ② 若target>arr[mid] ,则left=mid+1,若target<arr[mid],则right=mid-1,若target==arr[mid] ,则查找结束

    ③ 递归执行② ,执行完后返回-1,表示没找到

    javascript实现如下:

    function binarySearh(arr,target){
        if(!(arr instanceof Array) || !arr.length) return -1;
        var left=0,
            right=arr.length-1,
            mid;
        while(left<=right){
            mid=Math.floor((left+right)/2);
            if(target<arr[mid]){
                right=mid-1;
            }
            else if(target>arr[mid]){
                left=mid+1;
            }
            else{
                return mid;
            }
        }
        return -1;
    }

    javascript实现

    function binarySearchInsertionSort(arr){
        if(!(arr instanceof Array)) return [];
        if(arr.length<=1) return arr;
        // cur 当前处理的数字   left、right二分查找第一个>=当前元素的位置的index,查找区间的左右index,中间index
        var i,cur,left,right,mid;
        for(i=1;i<arr.length;i++){
            left=0;
            right=i-1;
            cur=arr[i];
            //用二分查找找到第一个大于当前元素的索引
            while(left<=right){
                mid=Math.floor((left+right)/2);
                if(cur<arr[mid]){
                    right=mid-1;
                }
                else{
                    left=mid+1;
                }
            }
            //插入元素
            arr.splice(left,0,arr.splice(i,1)[0]);
        }
        return arr;
    }
  • 相关阅读:
    matplotlib直方图绘图并且标注数字
    爬虫最基础知识串行和异步进阶代码
    卡方检验
    德国VoIP 系统中发现秘密后门
    python 处理字典键值合并
    python 读取json大文件
    上下文管理器的使用
    服务端高并发分布式架构
    上下文管理器连接数据库示例
    上下文管理器
  • 原文地址:https://www.cnblogs.com/tzyy/p/4871986.html
Copyright © 2020-2023  润新知