二分查找 找到了返回位置 没找到返回应该插入的位置

很少用JS来写算法, 需要注意的是JS是没有整形浮点型什么的  所以计算时要取整

  var arr = [1,4,6,12,17,19,44,66,71];
  function bisearch(arr,low, high, val){
    var mid = parseInt((low + high)/2) ;
    if(low <= high){
      if( arr[mid] == val){
        return mid;
      }else{
        if(arr[mid] < val){
          return bisearch(arr,mid+1,high,val);
        } else{
          return bisearch(arr,low,mid-1,val);
        }
      }
    }else{
      return low;
    }
  }
  console.log(bisearch(arr,0,arr.length-1,44));
  console.log(bisearch(arr,0,arr.length-1,55));
时间: 2024-10-13 12:01:47

二分查找 找到了返回位置 没找到返回应该插入的位置的相关文章

二分查找的相关算法题

最近笔试经常遇到二分查找的相关算法题 1)旋转数组中的最小数字 2)在旋转数组中查找某个数 2)排序数组中某个数的出现次数 下面我来一一总结 1 旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 实现数组的旋转见左旋转字符串. 和二分查找法一样,用两个指针分别指向数组的第一个元素和最后一个元素. 我们注意到旋转

可查找重复元素的二分查找算法

可查找重复元素的二分查找算法 二分查找算法思想:又称为 折半查找,二分查找适合对已经排序好的数据集合进行查找.假设有一升序的数据集合,先找出升序集合中最中间的元素,将数据集合划分为两个子集,将最中间的元素和关键字key进行比较,如果等于key则返回:如果大于关键字key,则在前一个数据集合中查找:否则在后一个子集中查找,直到找到为止:如果没找到则返回-1. 思路: 1.先定义两个下标 , left = 0 , right = arr.length -1; 2.因为我们也不知道要循环多少次,定义一

程序员,你应该知道的二分查找算法

原理 二分查找(Binary Search)算法,也叫折半查找算法.二分查找的思想非常简单,有点类似分治的思想.二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0. 为了方便理解,我们以数组1, 2, 4, 5, 6, 7, 9, 12, 15, 19, 23, 26, 29, 34, 39,在数组中查找26为例,制作了一张查找过程图,其中low标示左下标,high标示右下标,mid标示中间值下标 二分查

二分查找法-java实现

二分查找法就是对一个从小到大排好序的数组中寻找一个数val,先用待找的数val和中间值比较,如果比中间值大,那么在中间值右边寻找:如果比中间值小,那么在中间值左边寻找.一直递归下去.知道找到val.如果没找到,则输出在序列里面没有相关的数据. package com.PengRong.A; public class BinaryFind { public static void main(String[] args) { // TODO Auto-generated method stub in

二分查找的两种实现方式

笔者在这里给出二分查找的两种实现方式. 一. 第一种是健忘版的二分查找,即不管是否已经找到target,查找算法都继续对表进行再分,直到剩下的表的长度为1. 递归实现如下: Error_code recursive_binary_1(const Ordered_list &the_list, const Key &target, int bottom, int top, int &position) { Record data; if (bottom < top) { int

二分查找排序

static final int N=15; static void quickSort(int[] arr,int left,int right) //快速排序算法 { int f,t; int rtemp,ltemp; ltemp=left; rtemp=right; f=arr[(left+right)/2]; //确定分界值 while(ltemp<rtemp){ while(arr[ltemp]<f) ++ltemp; while(arr[rtemp]>f) --rtemp;

(二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; /** * 从有序递增旋转数组45679123 中找到数字6的位置 * 数组递增 但有旋转 * 二分查找思想 * 时间复杂度小于O(N) * {7,8,9,10,1,2,3,4,5,6} *************/ int find_revolve_array(const int arr[], int len, int value) { if

在由N个元素构成的集合S中,找出最小元素C,满足C=A-B,其中A,B是都集合S中的元素,没找到则返回-1

package bianchengti; /* * 在由N个元素构成的集合S中,找出最小元素C,满足C=A-B, * 其中A,B是都集合S中的元素,没找到则返回-1 */ public class findMinValue { //快速排序 public static void sort(int a[], int low, int hight) { if (low > hight) { return; } int i, j, key; i = low; j = hight; key = a[i]

剑指offer——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)

题目: 统计一个数字在排序数组中出现的次数. 思路: 因为是排好序的数组,所以可以采用二分查找的算法. 一般最容易想到的思路是采用二分查找先找到一个,然后往他左右两边遍历,但是这个方法由于在n个数组中还可能有n个k,所以 查找的复杂度还是O(n) 可以先用二分查找算法找到第一个出现的位置,即当找到一个时,看它前面一个是否也是k或者是否已经是查找这段的第一个了 然后同样用二分查找找最后一个出现的位置. 1 #include<iostream> 2 #include<vector> 3