查找算法——二分(折半)查找

基本思想:

       //待查记录的顺序为从小到大

  1. 首先将待查元素的关键字(key)值与待查记录中间位置上上(下标为mid)记录的关键字进行比较,若相等,则查找成功
  2. 若 key>r(mid).key,则说明待查记录只可能在后半部分[mid+1,N-1]中,下一步应在后半部分中查找
  3. 若key< timid). key,说明待查记录只可能在前半部分[0,mid-1]中,下一步应在r的前半个部分中查找
  4. 重复上述步骤,逐步缩小范围,直到查找成功或待查记录为空失败时为止。

    注意:中间值位置求出若为小数,应向下整,即4.5=4,非四舍五入;中间值己经比较过不相等,在划分下一次比较区间时,无需将中间值位置再纳入下一次比较区间;待查记录必须已排好序

时间复杂度为O(log2n)

    #define N 10
    //对顺序为从小到大的数组进行折半查找 
    int arr[] = {1,2,3,4,5,6,7,8,9,10};//待查找数组 
    int low = 0;//数组下标最小 
    int high = N-1;//数组下标最大 
    int key = 0;//带查找元素 
    int mid;//中间变量 
    while(low <= high){
mid = (low + high)/2;
        if(key < arr[mid]){
            high = mid -1;
        }
        else if(key == arr[mid] ){
            printf(“%d”,mid+1);
            return 0;
        }
        else{
            low = mid +1 ;
        }   
    }

    printf(“未查找到”);  

    #define N 10
    //对顺序为从大到小的数组进行折半查找 
    int arr[N] = {10,9,8,7,6,5,4,3,2,1};//待查找数组 
    int low = 0;//数组下标最小 
    int high = N-1;//数组下标最大 
    int key = 0;//带查找元素 
    int mid;//中间变量 
    while(mid = (low + high)/2 ){
    if(key > arr[mid]){
            high = mid -1;  
        }
        else if(key == arr[mid] ){
            printf(“%d”,mid+1);
            return 0;
        }
        else{
            low = mid +1 ;  
        }       
    }
    printf(“未查找到”); 

点赞