zoukankan      html  css  js  c++  java
  • 排序算法——二分插入排序

    思路

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

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

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

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

    ④ 遍历完成后排序完成

    前置技能

    二分查找

    在一个有序数组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;
    }
  • 相关阅读:
    3Dtouch 的实际应用详解(tableView中的应用)
    使用UIScrollView的zoomscale实现图片捏合放大
    SVN命令使用详解
    参数传递
    cookie文件路径
    XML和HTML之间的差异
    cssSelector元素定位方法
    如何调用一个数据完整的firefox浏览器
    Android生命周期详解
    android 利用countDownLatch实现主线程与子线程之间的同步
  • 原文地址:https://www.cnblogs.com/tzyy/p/4871986.html
Copyright © 2011-2022 走看看