C----整形有序数组的查找

目录

重点:

二分查找:

普通方法:


重点:

举例:
 int arr[10] = { 0 };
  sizeof(arr)整个数组的大小 sizeof(arr[0])第一个元素的大小   sizeof(arr) / sizeof(arr[0])数组元素的个数

数组传参实际上传的是数组首元素的地址,而不是整个数组。在含函数内部计算一个函数参数的数组元素个数是不靠谱的,
 int binary_search(int arr[],int k)形参看上去是数组,实际是指针变量。
错误示范:
int binary_search(int arr[], int k) {
    int sz = sizeof(arr) / sizeof(arr[0]);//   1/2
               4/8                  4
        int left = 0;
        int right = sz - 1;

    

    }

二分查找:

(1)

#include<stdio.h>
int binary_search(int arr[], int k, int sz) {
    int left = 0;
    int right = sz - 1;
    
    while (left<=right) {
        int mid = (left + right) / 2;      //        int mid = left + (right - left) / 2;
        if (arr[mid] < k) {
            left = mid + 1;
        }
        else if (arr[mid] > k) {
            right = mid - 1;
        }
        else {
            return mid;
        }
    }
    return - 1;//找不到
    
}
int main() {
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int k = 7;
    //找到了返回下标
    // 找不到返回-1

    //int sz = sizeof(arr) / sizeof(arr[0]); 
    // int pos=binary_search(arr, k, sz);


    int pos=binary_search(arr, k,10);//在arr的10个元素中找K             
    if (-1 == pos)
        printf("找不到\n");
    else
        printf("找到了,下标是:%d\n", pos);
    return 0;
}

(2)

普通的二分查找
int main() {
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int k=7;  //找的元素
    int sz = sizeof(arr) / sizeof(arr[0]);//数组中的个数,几个数
    int left = 0;
    int right = sz - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] < k) {
            left = mid+1;
        }
        else if (arr[mid] > k) {
            right = mid - 1;
        }
        else {
            printf("找到了,下标为%d", mid);
            break;
        }
    }
    if (left > right) {
        printf("找不到");
    }

    return 0;
}

普通方法:


int main() {
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int k = 7;   //找的元素
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    for (i = 0; i < sz; i++){
        if (arr[i] == k) {
            printf("找到了下标是:%d",i);
            break;
        }
    }
    if (i == sz) {
        printf("找不到");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值