zoukankan      html  css  js  c++  java
  • 二分查找(折半查找)

    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 }
  • 相关阅读:
    Python 中特殊变量/方法命名规则说明(特别是私有变量)及使用实例
    博客(文本)编辑工具Markdown使用初体验
    Vue2.0关于生命周期和钩子函数
    Vue2.0中的路由配置
    Vue项目中引入外部文件(css、js、less)
    利用vue-cli创建Vue项目
    vue+webpack构建项目
    VueJs2.0建议学习路线
    Python基础 :正则表达式
    Python框架 :WEB框架
  • 原文地址:https://www.cnblogs.com/shanlu0000/p/13071976.html
Copyright © 2011-2022 走看看