zoukankan      html  css  js  c++  java
  • 48 查找

    1,在C中,我们常用的查找有两种:

      ①顺序查找

      ②二分查找

    2,顺序查找:有一个数列:{ 23,1,34,89,101 } 

      猜数游戏:从键盘中任意输入一个数,判断数列中是否包含该数【顺序查找】

      如果找到了,就提示找到,并给出下标值。找不到就提示 没有

     1 int seqSearch(int arr[],int arrlen,int findval) {
     2     for (int i = 0;i < arrlen;i++) {
     3         if (arr[i] == findval) {
     4             return i;
     5         }
     6     }
     7     return -1;
     8 }
     9 void main() {
    10     //按照数组进行遍历,一个一个的比较,如果相等,则找到
    11     int arr[] = { 23,1,34,89,101 };
    12     int arrlen = sizeof(arr) / sizeof(int);
    13     int num = 34;
    14     int res = seqSearch(arr, arrlen, num);
    15     printf("res=%d", res);//2
    16     if (res != -1) {
    17         printf("找到了,下标是%d
    ",res);
    18     }
    19     else {
    20         printf("没有找到");
    21     }
    22     
    23 
    24 }

    打印结果:找到了,下标是2

    第二步,把想要寻找的值变成用户的输入即可:

     1 int seqSearch(int arr[],int arrlen,int findval) {
     2     for (int i = 0;i < arrlen;i++) {
     3         if (arr[i] == findval) {
     4             return i;
     5         }
     6     }
     7     return -1;
     8 }
     9 void main() {
    10     //按照数组进行遍历,一个一个的比较,如果相等,则找到
    11     int arr[] = { 23,1,34,89,101 };
    12     int arrlen = sizeof(arr) / sizeof(int);
    13     int num = 0;
    14     printf("请输入一个想要寻找的值:");
    15     scanf("%d", &num);
    16     int res = seqSearch(arr, arrlen, num);
    17     printf("res=%d", res);//2
    18     if (res != -1) {
    19         printf("找到了,下标是%d
    ",res);
    20     }
    21     else {
    22         printf("没有找到");
    23     }
    24     
    25 }

    3,二分查找:请对一个有序数组进行二分查找,{ 1,8,10,89,1000,1234 },输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示没有这个数

      二分查找的前提是:该数组是一个有序数组

     1 int binarySearch(int arr[], int arrlen, int findval) {
     2     int mid_index = (0 + arrlen - 1) / 2;
     3     int left_index = 0;
     4     int right_index = arrlen - 1;
     5     //注意,要定义没有找到的情况
     6     if (left_index > right_index) {
     7         return -1;
     8     }
     9     //1,当数组的中间值大于目标值,说明在数组左边寻找
    10     else if (arr[mid_index] > findval) {
    11         for (int i = 0;i < mid_index;i++) {
    12             if (arr[i] == findval) {
    13                 return i;
    14             }
    15         }
    16         return -1;
    17     }
    18     //2,当数组的中间值小于目标值,说明在数组的右边寻找
    19     else if(arr[mid_index] < findval) {
    20         for (int i = mid_index;i <= right_index;i++) {
    21             if (arr[i] == findval) {
    22                 return i;
    23             }
    24         }
    25         return -1;
    26     }
    27     //3,数组的中间值等于目标值,找到了
    28     else {
    29         return mid_index;
    30     }
    31 }
    32 
    33 void main() {
    34     int arr[] = { 1,8,10,89,1000,1234 };
    35     int arrlen = sizeof(arr) / sizeof(int);
    36     int num = 0;
    37     printf("请输入你想找的数字:");
    38     scanf("%d", &num);
    39     int res=binarySearch(arr, arrlen, num);
    40     printf("res=%d
    ", res);
    41     if (res != -1) {
    42         printf("找到了,下标是%d
    ", res);
    43     }
    44     else {
    45         printf("没有找到");
    46     }
    47 
    48 }

     可以使用递归实现二分查找:

     1 int binarySearch(int arr[], int leftIndex,int rightIndex, int findval) {
     2     int midIndex = (leftIndex+rightIndex) / 2;
     3     //注意,要定义没有找到的情况
     4     if (leftIndex > rightIndex) {
     5         return -1;
     6     }
     7     //1,当数组的中间值大于目标值,说明在数组左边寻找
     8     else if (arr[midIndex] > findval) {
     9         binarySearch(arr, leftIndex, midIndex - 1, findval);
    10     }
    11     //2,当数组的中间值小于目标值,说明在数组的右边寻找
    12     else if(arr[midIndex] < findval) {
    13         binarySearch(arr, midIndex + 1, rightIndex, findval);
    14     }
    15     //3,数组的中间值等于目标值,找到了
    16     else {
    17         return midIndex;
    18     }
    19 }
    20 
    21 void main() {
    22     int arr[] = { 1,8,10,89,1000,1234 };
    23     int arrlen = sizeof(arr) / sizeof(int);
    24     int num = 0;
    25     printf("请输入你想找的数字:");
    26     scanf("%d", &num);
    27     int res=binarySearch(arr, 0,arrlen-1,num);
    28     printf("res=%d
    ", res);
    29     if (res != -1) {
    30         printf("找到了,下标是%d
    ", res);
    31     }
    32     else {
    33         printf("没有找到");
    34     }
    35 
    36 }
  • 相关阅读:
    python自学第13天 hashlib,re模块
    python自学第12天 模块
    python自学第12天 模块定义,导入,内置模块
    python自学第11天-单线程并发、迭代器,序列化,获取路径
    python自学第10天,生成器
    python自学第9天,装饰器
    python自学第8天,变量,递归
    python自学第7天,函数,参数
    彻底搞懂Session与Cookie的异同!
    你真的搞懂了Java中的<<、>>、>>>运算符嘛?
  • 原文地址:https://www.cnblogs.com/shanlu0000/p/12359793.html
Copyright © 2011-2022 走看看