zoukankan      html  css  js  c++  java
  • <C> 最大值以及最大值下标 二分查找(折半查找)

    一.最大值以及最大值下标

     1 #include<stdio.h>
     2 
     3 int FindMaxIndex(int arr[],int nLen,int *p);
     4 
     5 int main()
     6 {
     7     int arr[10] = {1,5,7,3,4,6,8,9,2,0};
     8     int Max;
     9     int Index = FindMaxIndex(arr,sizeof(arr)/sizeof(arr[0]),&Max);
    10 
    11     return 0;
    12 }
    13 
    14 int FindMaxIndex(int arr[],int nLen,int *p)
    15 {
    16     int i;
    17     int Max = 0;
    18     int Index;
    19     for(i=0;i<nLen;i++)
    20     {
    21         if(arr[i]>Max)
    22         {
    23             Max = arr[i];
    24             Index = i;
    25         }
    26     }
    27     *p = Max;
    28     return Index;
    29 }

    注:这个代码没什么好说的 但是需要注意的是 每个函数只能有一个返回值 但是可以加参数 通过内存空间

    二.二分查找(折半查找)

    1.折半查找的前提:数组是有序

    2.基本思想:

    ①定义一个shu 一个数组是arr[100] 这个shu在arr这个有序数组中

    ②定义一个int类型的变量begin=0  end=99

    那么这个数组的中间元素的下标就是(0+99)/2

    ③作比较:

    如果shu比中间元素小 说明shu在数组的前一半 end=中间元素的下标-1

    如果shu比中间元素大 说明shu在数组的后一半 begin=中间元素的下标+1

    ④以此类推 重复这个过程 直到找到这个数为止 当然 也有可能找不到

    最后应该会剩三个数 或者两个数

    注:因为我们不知道循环的次数 但是begin又不可以比end大 所以我们用while循环来控制循环的次数

    那begin可不可以等于end呢? 答案是可以的! 因为比如最后只剩下两个数的时候 没有等于号就会少比一次

    PS:下面放代码 这段代码我把排序的过程也加进去了 那么最后返回的下标就是排好序之后新数组的下标

     1 #include<stdio.h>
     2 
     3 void BubbleSort(int arr[],int nLen);
     4 int BinaryFind(int arr[],int nLen,int n);
     5 
     6 int main()
     7 {
     8     int arr[10] = {110,11,2,33,44,67,645,745,91,900};
     9     int n = 44;
    10     int Index;
    11 
    12     BubbleSort(arr,sizeof(arr)/sizeof(arr[0]));
    13     Index = BinaryFind(arr,sizeof(arr)/sizeof(arr[0]),44);
    14 
    15     return 0;
    16 }
    17 
    18 void BubbleSort(int arr[],int nLen)
    19 {
    20     int i,j;
    21     for(i=0;i<nLen-1;i++)
    22     {
    23         for(j=0;j<nLen-1-i;j++)
    24         {
    25             if(arr[j] > arr[j+1])
    26             {
    27                 arr[j] = arr[j] ^ arr[j+1];
    28                 arr[j+1] = arr[j] ^ arr[j+1];
    29                 arr[j] = arr[j] ^ arr[j+1];
    30             }
    31         }
    32     }
    33 }
    34 
    35 int BinaryFind(int arr[],int nLen,int n)
    36 {
    37     int begin = 0;
    38     int end = nLen -1;
    39     int mid;
    40 
    41     while(begin <= end)
    42     {
    43         mid = (begin + end)/2;
    44         if(n > arr[mid])
    45         {
    46             begin = mid + 1;
    47         }
    48         else if(n < arr[mid])
    49         {
    50             end = mid - 1;
    51         }
    52         else
    53         {
    54             return mid;
    55         }
    56     }
    57 
    58     return -1;
    59 }

    3.注意:

    ①在BinaryFind函数中 最后return -1 是因为数组的下标是没有-1的 所以当return了-1的时候 就说明数组中 没有查找到这个你想查找的shu

    ②拓展:冒泡排序不需要中间变量交换两个数的方法(上面的代码中有运用到)

    1 a = a ^ b;
    2 b = a ^ b;
    3 a = a ^ b;
  • 相关阅读:
    设置Tomcat根目录
    使用Servlet Filter做Login checking
    Javac命令一次编译一个目录下的所有java文件
    Java ArrayList操作
    Java 读Properties
    Java文件读写
    Servlet Listener
    Servlet连接数据库
    Servlet Filter 3
    Servlet Filter 2
  • 原文地址:https://www.cnblogs.com/Aaaaaalei0612/p/8728305.html
Copyright © 2011-2022 走看看