给定已经按照升序排好序的n个元素A[0,n-1],现要在这n个元素中找出一特定元素x
1.此时数组A是排好序的,我们要根据二分法来找出x,先将数组分成两部分,数组的开始left,数组的结束right,中间位置为mid.此时数组的左边部分为A[left,mid-1],右边部分为A[mid+1,right].
int mid=(left+right)/2;//中间元素为A[mid]
2.判断我们要找的元素x是否等于中间的元素A[mid],如果等于则不用再往下找了,此时直接返回mid的值(返回该特点元素x在数组中的位置)。
if(x==A[mid]){return mid;}
3.若我们找的元素x小于中间元素A[mid]的值,那结果应该在左边部分的数组中
if(x<A[mid]){
binarySearch(A,x,left,mid-1);//若x小于A[mid],在数组左边区域,再次调用二分函数查找左边部分是否有等于x的值
}
4.若我们找的元素x大于中间元素A[mid]的值,那结果应在右边部分的数组中
if(x>A[mid]){
binarySearch(A,x,mid+1,right);//若x>A[mid],则利用二分法在右边部分的数组进行查找。
}
5.若查找到right<left时,则此时该元素并未存在(找不到)
if(right<left){
return -1;
}
完整代码:
#include<stdio.h>
#include<malloc.h>
//二分搜索
int binarySearch(int A[],int &x,int left,int right) {
if (right >= left) {
int mid = (left + right) / 2;
if (x == A[mid]) {
return mid;
}
else if (x < A[mid]) {
binarySearch(A, x, left, mid - 1);
}
else {
binarySearch(A, x, mid + 1, right);
}
}
else {
return -1;
}
}
int main() {
int n,x;
printf("请输入数组长度:");
scanf_s("%d",&n);
int* A=(int*)malloc(sizeof(int) * n);
printf("请输入数组数据:");
for (int i = 0; i < n;i++) {
scanf_s("%d",&A[i]);
}
printf("请输入你要查找的数据:");
scanf_s("%d",&x);
int result=binarySearch(A,x,0,n-1);
if (result>=0) {
printf("查找结果在数组中的第%d个位置", result+1);
}
else {
printf("未找到!");
}
return 0;
}
上面代码可以键盘输入数组的值,当然也可以直接确定A中的元素:
#include<stdio.h>
#include<malloc.h>
//二分搜索
int binarySearch(int A[],int &x,int left,int right) {
if (right >= left) {
int mid = (left + right) / 2;
if (x == A[mid]) {
return mid;
}
else if (x < A[mid]) {
binarySearch(A, x, left, mid - 1);
}
else {
binarySearch(A, x, mid + 1, right);
}
}
else {
return -1;
}
}
int main() {
int x;
int A[5]={1,2,3,4,5};
printf("请输入你要查找的数据:");
scanf_s("%d",&x);
int result=binarySearch(A,x,0,n-1);
if (result>=0) {
printf("查找结果在数组中的第%d个位置", result+1);
}
else {
printf("未找到!");
}
return 0;
}