美文网首页
二分查找及其扩展

二分查找及其扩展

作者: tingjieee_19e5 | 来源:发表于2018-08-12 11:46 被阅读0次

在有序数组中,二分查找是效率较高的查找算法。
二分查找一般有递归和迭代

//递归版本
int binarySearch(int *data, int target, int start, int end){
    if(start > end)  return -1;
    int midIndex = (start + end) / 2;
    int midData = data[midIndex];
    if(midData == target)
          return midIndex;
    else if(midData > target)
         end = midIndex - 1;
     else 
         start = midIndex + 1;
    return binarySearch(data,target,start,end);
}
//迭代版本
int binarySearch(int *data, int target, int length){
     int low = 0, up = length; 
      while(low < up){
           int midIndex = (low + up) / 2;
           int midData = data[midIndex];
           if(midData == target)   return midIndex;
           else if(midData > target)  up = midIndex - 1;
           else  low = midIndex + 1;      
    }
  return  -1;
}

对有序数组查找指定数字在数组中出现的次数
//通过二分查找,知道指定数字出现的第一个和最后一个的位置,就可以确定出现次数了。

//找到第一个位置的目标值
        while(low < up){
            size_t mid = (low + up) / 2;
            int middata = data[mid];
            if(target < middata )
                up = mid;
            else if(target > midata)
                low = mid;
            else if(target == middata){
                if((mid > 0 && data[mid-1] != target) || mid == 0 )
                   return mid;
                else
                    up = mid -1;
            }
        }
        
//找到最后位置的目标值
        while(low < up){
            size_t mid = (low + up) / 2;
            int middata = data[mid];
            if(target < middata )
                up = mid;
            else if(target > midata)
                low = mid;
            else if(target == middata){
                if((mid < length-1 && data[mid+1] != target) || mid == length -1 )
                   return mid;
                else
                    low = mid -1;
            }
        }

对有序的数组,找到正好可以容纳这个数的位置
//通过二分查找,找到正好小于等于当前数,却大于前一个数的位置

        while(low < up){
            size_t mid = (low + up) / 2;
            if(target < core[mid] ){
                if(target > core[mid - 1]){
                    j = mid;
                    break;
                } else if(target < core[mid - 1]) {
                    up = mid;
                } else if(target == core[mid - 1]) {
                    j = mid-1;
                    break;
                }
            } else if(target > core[mid]){
                low = mid;
            } else if(target == core[mid]){
                j = mid;
                break;
            }
        }
        cout << j << endl;

相关文章

  • 二分查找及其扩展

    在有序数组中,二分查找是效率较高的查找算法。二分查找一般有递归和迭代 对有序数组查找指定数字在数组中出现的次数//...

  • 33. Search in Rotated Sorted Arr

    二分查找的扩展

  • 二分查找算法及其扩展

    二分查找是面试中手写代码经常遇到的题目, 昨天还有同事说有个面试, 手写代码这一环节就是二分查找.在下面两个版本的...

  • 算法

    泽毛的简书 面试算法知识梳理(8) - 二分查找算法及其变型

  • 二分查找及其延伸

    1.基本概念 二分查找就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大...

  • 二分查找及其变种

    二分查找,也叫做折半查找。 二分查找是在已经拍好序的数组中,每次取中间值与待查关键字比较,如果中间位置的值笔待查关...

  • 二分查找及其变种

    一、 二分查找 如无特殊说明,本文中所有用到的待查数组均为从小到大顺序。 1.1 无重复元素的二分查找 实现C++...

  • 二分查找及其变种

    二分查找是非常基础的算法,日常应用和面试中都极常见。其思想简单,不再赘述,但想要写好二分查找,也并不是那么容易的。...

  • python二分查找算法

    文章概述 二分查找法介绍 简单查找与二分查找对比 二分查找  二分查找算法主要思想:在有序列表中查找指定元素,先从...

  • 数据结构和算法--二分查找

    二分查找 二分查找的思想 二分查找(Binary Search)算法,也叫折半查找算法。 二分查找针对的是一个有序...

网友评论

      本文标题:二分查找及其扩展

      本文链接:https://www.haomeiwen.com/subject/hahsbftx.html