<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;

 

posted @ 2018-04-06 18:14  Aaaaaalei  阅读(365)  评论(0编辑  收藏  举报