zoukankan      html  css  js  c++  java
  • (转载)旋转数组查找 最简洁方法 总结

    百度搜了几篇,太多了代码,实则苦涩难懂。面试笔试宝典总结的很给力。突然不能访问。以下是从百度快照中扒出来的。

    次二分查找>:二分查找算法有两个关键点:1)数组有序;2)根据当前区间的中间元素与x的大小关系,确定下次二分查找在前半段区间还是后半段区间进行。

    仔细分析该问题,可以发现,每次根据low和high求出mid后,mid左边([low, mid])和右边([mid, high])至少一个是有序的。

    a[mid]分别与a[left]和a[right]比较,确定哪一段是有序的。

    如果左边是有序的,若x<a[mid]且x>a[left], 则right=mid-1;其他情况,left =mid+1;

    如果右边是有序的,若x> a[mid] 且x<a[right] 则left=mid+1;其他情况,right =mid-1;

    代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    int binary_search_in_rotate_array(int a[], int n, int x) {
     int low = 0;
    �0�2 int high = n-1; //注意上界
    �0�2 while(low <= high) {
    �0�2�0�2�0�2 int mid = low + ((high - low) >> 1); //可防止溢出;移位操作高效;
    �0�2�0�2�0�2 if(a[mid] == x)
    �0�2�0�2�0�2�0�2�0�2 return mid;
    �0�2�0�2�0�2 if(a[mid] >= a[low]) {//左半段有序
    �0�2�0�2�0�2�0�2�0�2 if(x < a[mid] && x >= a[low]) {
    �0�2�0�2�0�2�0�2�0�2�0�2�0�2 high = mid -1;
    �0�2�0�2�0�2�0�2�0�2 } else {
    �0�2�0�2�0�2�0�2�0�2�0�2�0�2 low = mid + 1;
    �0�2�0�2�0�2�0�2�0�2 }
    �0�2�0�2�0�2 } else { //右半段有序
    �0�2�0�2�0�2�0�2�0�2 if(x > a[mid] && x <= a[high]) {
    �0�2�0�2�0�2�0�2�0�2�0�2�0�2 low = mid + 1;
    �0�2�0�2�0�2�0�2�0�2 } else {
    �0�2�0�2�0�2�0�2�0�2�0�2�0�2 high = mid -1;
    �0�2�0�2�0�2�0�2�0�2 }
    �0�2�0�2�0�2 }
    �0�2 }
    �0�2 return -1; // 找不到,则返回-1
    }

     

     
     
  • 相关阅读:
    JBuilder链接sql server数据库
    各种数据库连接代码(java)
    各种数据库连接代码的测试类(java)
    简单数据查询语句
    Oracle卸载
    Java字符串转换
    静态类示例
    授权对象的检查
    BAPI
    clear、REFRESH、free区别
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/3863141.html
Copyright © 2011-2022 走看看