问题:
在一个数组中查找指定的数字,如果找到,返回数组下标
解法一:遍历数组中的所有元素,进行比较
源代码:
#include<stdio.h>
#include<stdlib.h>
int main() {
int arr[] = { 1,3,4,5,2,0 };
int i = 0;
int to_find = 5;
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { //使用sizeof(arr) / sizeof(arr[0])可以避免数数组元素的个数
if (arr[i] == to_find) {
break;
}
}
if (i < sizeof(arr) / sizeof(arr[0])) {
printf("找到了!下标为%d\n",i);
}
else {
printf("没找到!\n");
}
system("pause");
return 0;
}
显然上述方法需要将所有数组元素遍历,这样时间长,运行慢,那么我们可以折中查找,减少比较的时间
解法二:折半/二分查找法(前提是有序数组)
思路:调用函数BinaryFind,如果找到了返回mid的值,如果没找到,返回-1
使left=数组首元素,right=数组最后一个元素,mid=(left+right)/2.
[left,right]为待查找区间,将待查找元素与mid进行比较
如果待查找元素的值<mid,则使mid=right-1,>mid的元素将不用在进行比较,大幅节约时间
反之如果待查找元素的值>mid,则相反。
源代码:
#include<stdio.h>
#include<stdlib.h>
int BinaryFind(int arr[], int size, int to_find) {
int left = 0;
int right = size - 1; //[left,right]为待查找区间
while (left <= right) {
int mid = (left + right) / 2;
if (to_find < arr[mid]) {
right = mid - 1;
}
else if (to_find > arr[mid]) {
left = mid + 1;
}
else {
return mid;
}
}
return -1;
}
int main() {
int arr[] = { 1,3,4,5,7,9 };
int to_find = 9;
int size = sizeof(arr) / sizeof(arr[0]);
int i = BinaryFind(arr, size, to_find);
if (i == -1) {
printf("没找到!\n");
}
else {
printf("找到了!下标为%d\n", i);
}
system("pause");
return 0;
}