写的有点乱,如有不足,还请斧正
二分法:
使用条件为:数组是排好序的,不是混乱的。
下面的代码有个缺陷:我们的数组只有在从小到大排列时,才能正确的找到信息。
int erfenfa(int *arr,int need_find_number ,int arr_number) {
int start, end, mid, needfind;
start = 0;
end = arr_number;
needfind = need_find_number;
while (start <= end) {
mid = (start + end) / 2;
if (arr[mid] < needfind) {
start = mid + 1;
}
else if (arr[mid] > needfind) {
end = mid - 1;
}else {
printf("mid:%d",mid);
return mid;
}
}
printf("没有找到");
return -1;
}
void main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int end,needfind;
end = sizeof(arr) / sizeof(arr[0]) - 1;
needfind = 4;
erfenfa(arr,needfind,end);
}
如果给出的数组是从大到小排列的,那么上面的函数将不再可以使用,下面的则符合
int erfenfa(int *arr,int need_find_number ,int arr_number) {
int start, end, mid, needfind;
end = 0;
start = arr_number;
needfind = need_find_number;
while (end <= start) {
mid = (start + end) / 2;
if (arr[mid] > needfind) {
end = mid + 1;
}
else if (arr[mid] < needfind) {
start = mid - 1;
}else {
printf("mid:%d",mid);
return mid;
}
}
printf("没有找到");
return -1;
}
void main() {
int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
int end,needfind;
end = sizeof(arr) / sizeof(arr[0]) - 1;
needfind = 9;
erfenfa(arr,needfind,end);
}
只要将erfenfa()函数内end与start调换位置即可。
在传递数组的同时,为什么还要传递数组内的个数呢?
因为在传递数组时,传递的只是一个数组的第一个指针即传递的为arr[0],如果在erfenfa内判断数组的个数end=sizeof(arr)/sizeof(arr[0])-1,这里的arr不是整个数组,而仅仅是arr[0],所以这样求不出来数组的个数。