问题:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0
算法1:遍历数组
原理:从数组T[0]开始,一个一个遍历,直到找到x;
函数代码:
int traverse(int* arr,int n,int k){
int i=0;
for(i=0;i<n;i++){
if(arr[i]==k){
return i;
}
}
return 0;
}
算法时间复杂度:O(n)
算法二:二分法
原理:
从排好序的数组中,找到所要的数
假设数组T[]={1,2,3,4,5,6,7},查找的数n=2
- 第一次的搜索范围是{1,2,3,4,5,6,7 },设置left=1,right=,middle = (l+r)/2=4,由3和n比较大小,4>n,说明要查找的数在左半边,使right=middle,此时left=0,right=4;
- 第二次搜索范围是[left,middle-1],即{1,2,3,4},此时middle=(1+4)/2=2,middle=n,则middle为查找的数,他的下表为middle-1;
代码
int binary(int* arr,int x,int a){
int left=0,right=x,middle;
while(left!=right-1){
middle = (left+right)/2;
if(arr[middle]>a){
right = middle;
}
else if(arr[middle]<a){
left = middle;
}
else{
return middle;
}
}
return 0;
}
复杂度:O(log n)
程序代码
#include <bits/stdc++.h>
using namespace std;
int traverse(int* arr,int n,int k);
int binary(int *arr,int x, int a);
int main(){
int n,i,x;
cout<<"输入数组长度:";
cin>>n;
int *arr = (int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++){
arr[i] = i+1;
}
cout<<"输入要查找的数:";
cin>>x;
cout<<"遍历数组结果:"<<traverse(arr,n,x)<<endl;
cout<<"二分法结果:"<<binary(arr,n,x)<<endl;
}