• 二分查找(折半查找)


    1,非递归方式:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 
     4 int BinarySearch(int arr[], int arrlen, int targetVal) {
     5     //int arrlen = sizeof(arr) / sizeof(arr[0]);
     6     //printf("arrlen:%d
    ", arrlen);  1 ???
     7     int mid_index = (0 + arrlen - 1) / 2;
     8     int left_index = 0;
     9     int right_index = arrlen - 1;
    10     if (left_index > right_index) { //没有找到的情况
    11         return -1;
    12     }
    13     //1,目标值比中间值小,在数组左边找
    14     else if (arr[mid_index] > targetVal) { 
    15         for (int i = 0; i <= mid_index; i++) {
    16             if (arr[i] == targetVal) {
    17                 return i;
    18             }
    19         }
    20         return -1;
    21     }
    22     //2,目标值比中间值大,在数组右边找
    23     else if (arr[mid_index] < targetVal) {
    24         for (int i = mid_index; i <= right_index; i++) {
    25             if (arr[i] == targetVal) {
    26                 return i;
    27             }
    28         }
    29         return -1;
    30     }
    31     //3,数组的中间值等于目标值,找到了,直接返回中间值下标
    32     else {
    33         return mid_index;
    34     }
    35 }
    36 
    37 void main() {
    38     int arr[] = {61,87,170,275,426,503,512,653,897,908};
    39     int num = 0;
    40     printf("初始数组是:
    ");
    41     int arrlen = sizeof(arr) / sizeof(int);
    42     //printf("%d
    ", arrlen); //10
    43     for (int i = 0; i < arrlen; i++) {
    44         printf("%d  ", arr[i]);
    45     }
    46     printf("
    ");
    47 
    48    
    49     printf("请输入你想找的数字:");
    50     scanf("%d", &num);
    51     int res = BinarySearch(arr,arrlen, num);
    52     if (res != -1) {
    53         printf("找到了,下标是%d
    ", res);
    54     }
    55     else {
    56         printf("没有找到");
    57     }
    58 
    59 }

    数组长度 arrlen 在 查找方法内计算 不正确,但是 在 main 中计算正确,(?)

    因此,直接使用了直接传参的方式,将 arrlen 传入到 BinarySearch( ) 中

     

    2,递归方式:

     1 //二分查找,递归
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 
     5 int BinarySearch(int arr[],int left_index, int right_index, int targetVal) {
     6     int mid_index = (left_index + right_index) / 2;
     7     if (left_index > right_index) { //没有找到的情况
     8         return -1;
     9     }
    10     //1,目标值比中间值小,在数组左边找
    11     else if (arr[mid_index] > targetVal) {
    12         BinarySearch(arr,left_index, mid_index - 1, targetVal);
    13     }
    14     //2,目标值比中间值大,在数组右边找
    15     else if (arr[mid_index] < targetVal) {
    16         BinarySearch(arr,mid_index+1, right_index, targetVal);
    17     }
    18     //3,数组的中间值等于目标值,找到了,直接返回中间值下标
    19     else {
    20         return mid_index;
    21     }
    22 }
    23 
    24 void main() {
    25     int arr[] = {61,87,170,275,426,503,512,653,897,908};
    26     int num = 0;
    27     printf("初始数组是:
    ");
    28     int arrlen = sizeof(arr) / sizeof(int);
    29     //printf("%d
    ", arrlen); //10
    30     for (int i = 0; i < arrlen; i++) {
    31         printf("%d  ", arr[i]);
    32     }
    33     printf("
    ");
    34 
    35     printf("请输入你想找的数字:");
    36     scanf("%d", &num);
    37     int res = BinarySearch(arr,0,arrlen-1, num);
    38     if (res != -1) {
    39         printf("找到了,下标是%d
    ", res);
    40     }
    41     else {
    42         printf("没有找到");
    43     }
    44 
    45 }
  • 相关阅读:
    4.终端
    **如何让CI框架支持service层
    *CI框架装载器Loader.php源码分析
    如何在CI中写工具类,在哪个目录写
    ***在PHP语言中使用JSON和将json还原成数组(json_decode()的常见错误)
    DedeCMS常见问题和技巧
    ***Linux系统下如何查看及修改文件读写权限
    ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
    PHP5.2至5.6的新增功能详解
    PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解
  • 原文地址:https://www.cnblogs.com/shanlu0000/p/13071976.html
Copyright © 2020-2023  润新知