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