二分查找及其扩展

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

//递归版本
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;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 5,811评论 0 2
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,322评论 0 13
  • 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本文...
    北方蜘蛛阅读 7,954评论 1 4
  • 天赋异禀不会的我不了吗哦
    赵山玉阅读 1,209评论 0 0
  • 拆页七: 《幸福课》161-162 页 【R阅读原文片段】 用 woop 思维来克服拖延症 有一位心理学家 加布里...
    媛子_6e9c阅读 1,449评论 3 0