关于#算法#的问题,如何解决?

给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x,返回其在数组中的位置,如果未找到返回-1。写出二分搜索的算法,并分析其时间复杂度。


template<class Type>

int BinarySearch(Type a[], const Type& x, int n)

{//在a[0:n]中搜索x,找到x时返回其在数组中的位置,否则返回-1

     Int left=0;  int  right=n-1;

     While (left<=right){

        int middle=(left+right)/2;

        if (x==a[middle]) return middle;

        if (x>a[middle]) left=middle+1;

        else right=middle-1;

      }

      Return -1;

}

时间复杂性为O(logn)

就写个二分法

#include <stdio.h>
#define N 15
int main()
{
    int a[N]={12,13,15,19,20,23,25,30,31,32,35,39,41,42,43};//
    int x;
    int left=0,right=N;//left循环起点   right循环终点
    int mid;
    int i=0;
    
    right=sizeof(a)/sizeof(a[0]);
    printf("输入要查找的数:");
    scanf("%d",&x);
    while(left<=right)
    {   mid=(left+right)/2;
        if(x<a[mid])//如果X<中间数mid,则结束当前循环,开始下一轮循环从0~mid
        {    
            right=mid-1;

        }else if(x>a[mid])//如果X>中间数mid,则结束当前循环,开始下一轮循环从mid~N
        {    
            left=mid+1;

        }else{
            mid++;
            printf("%d是数组中第%d个元素\n",x,mid);
            return 0;
        }
    }        
        printf("无此数\n");
        return 0;
}

函数形式

#include <stdio.h>
#define N 15
int  BinarySearch(int a[],int x)
{
    int left=0,right=N;//left循环起点   right循环终点

    int mid;
    
    while(left<=right)
    {   mid=(left+right)/2;
        if(x<a[mid])//如果X<中间数mid,则结束当前循环,开始下一轮循环从0~mid
        {    
            right=mid-1;

        }else if(x>a[mid])//如果X>中间数mid,则结束当前循环,开始下一轮循环从mid~N
        {    
            left=mid+1;

        }else{
            return mid;
        }
    }    
    return -1;    
}
int main()
{
    int a[N]={12,13,15,19,20,23,25,30,31,32,35,39,41,42,43};//
    int x,index;
    printf("输入要查找的数:");
    scanf("%d",&x);
    index=BinarySearch(a,x);
    if(index>=0)
         printf("在数组中的下标是%d",index);
     else
        printf("无此数");
    return 0;
}

调用的话,直接传了对应参数,findNum(a,数组下标起始位置,数组下标结束位置,目标值)

    int findNum(int a[], int left, int right, int target) {
        if (left > right) {
            return -1;
        } else {
            int mid = (left + right) / 2;  //中间的下标
            if (target == a[mid])
                return mid;
            else if (target < a[mid])
                return findNum(a, left, mid - 1, target);
            else
                return findNum(a, mid + 1, right, target);
        }
    }

二分法,时间复杂度就是O(logN)