线性查找
从头开始一个一个的数据进行比较,找到需要的数据。无序的数组,只能用线性查找。
算法复杂度O(N);
/*线性查找*/
#include<stdio.h>
int line_find(int data[],int size,int key){
int i;
for(i = 0; i < size; ++i){
if(key == data[i])
return i;
}
return -1;
}
int main(){
int arr[] = {13,45,21,37,49,19};
int size = sizeof(arr)/sizeof(arr[0]); //求数组元素个数
int key = 37;
int res = line_find(arr,size,key);
if(res == -1)
printf("没有找到
");
else
printf("找到了,位置是%d
",res);
}
二分查找
在使用二分查找之前要确认数组是有序的。假如数组是升序的,取数组的中间值data[mid]和需要查找的key值,进行比较。
如果key值大于data[mid],则再从从mid+1到尾端的中间值(key小于data[mid],则取开头到mid-1),与key比较,依次类推。
直到结束,如果依然没有匹配的数据则证明数组中没有要查找的值,返回-1.否则返回下标i。
算法复杂度O(logN).
注意:二分法查找的数组必须是有序的。
/*******************************************
* *
* 二分法查找,前提条件被查找的数组是有序的 *
* *
* *****************************************/
#include<stdio.h>
/*一般二分法查找*/
int half_find(int data[],int left,int right,int key){
while(left <= right){
int mid = right + left;
if(key < data[mid])
right = mid -1;
else
if(key > data[mid])
left = mid + 1;
else
return mid;
}
return -1;
}
/*递归二分法*/
int recurrence_half_find(int data[], int left,int right, int key){
if(left <= right){
int mid = (right + left)/2;
if(key < data[mid])
return recurrence_half_find(data,left,mid - 1,key);
else
if(key > data[mid])
return recurrence_half_find(data,mid + 1,right,key);
return mid;
}
return -1;
}
int main(){
int arr[] = {13,19,21,37,45,49};
int size = sizeof(arr)/sizeof(arr[0]);
int key = 37;
/*一般二分法查询测试*/
int res = half_find(arr,0,size-1,key);
if(res == -1)
printf("%d不存在
",key);
else
printf("%d存在,位置%d
",key,res);
/*递归二分法查询*/
res = half_find(arr,0,size-1,key);
if(res == -1)
printf("%d不存在
",key);
else
printf("%d存在,位置%d
",key,res);
return 0;
}