您的位置:首页 > 其它

两种简单查找算法之顺序查找和二分查找

2013-09-07 14:08 423 查看
查找对于计算机编程来说是非常常见的功能。对于当今的大信息数据时代,计算机对于查找的性能又有了新的挑战,如何设计一个高效的查询,对于系统的性能有着举足轻重的影响。下面我们就来看下最简单的两种查找算法。

顺序查找称得上是最简单的查找算法,其算法思想也比较简单。就是线性表的一段开始,依次将线性表中的数据拿来与需要查找的关键字比较,如果线性表中某个记录的关键字等于给定值,那么查找成功;如果线性表已经遍历完了,还没有查找到对应记录的话,则查找失败。

顺序查找的思路很简单,下面给出c语言的代码形式:

# include <stdio.h>
int seqSearch(int * arr,int n,int num);
int main(void){
int arr[10] = {3,8,6,13,22,17,5,9,30,27};
int num = 17;
int result;
result = seqSearch(arr,10,num);
if(result >= 0){
printf("查找成功,查找关键字对应的key是%d:",result);
}else{
printf("查找失败!");
}
return 0;
}
//顺序查找代码的实现
int seqSearch(int * arr,int n,int num){
int i;
for(i=0;i<n;i++){
if(arr[i] == num){
return i;
break;
}
}
return -1;
}


上面的代码很简单。但是他有一定的好处,就是对查找表中的顺序是没有限制的;但是坏处也很明显,因为都要依次给查找表中的数据做对比,所以最坏情况下查找成功需要进行n次比较。数据量大的时候,绝对是不可能考虑的查找算法。

上面看完了顺序查找,下面再来看一下二分查找。二分查找的思路也比较简单,但是它有一个限制,就是查找表必须是一个顺序集合。二分查找的总体思路是,先拿查找表中的一个中间元素与被查找值进行比较,这里可能有三种情况:

1.中间元素恰好等于了被查找值,这时查找成功。

2.中间元素的值小于被查找值,则让它在查找表的后半部分继续进行二分查找。

3.中间元素的值大于被查找值,则让它在查找表的前半部分继续进行二分查找。

如果进行到最后,还没有找到被查找元素的话,那么这次证明查找表中没有被查找的元素,则查找失败。

二分查找在本质上类似于递归的过程,就是在大的方向找不到的话就去小的方向找,直到末尾。下面给出二分查找的代码:

# include <stdio.h>
int binarySearch(int * arr,int n,int num);
int main(void){
int arr[10] = {3,5,6,8,9,13,17,22,27,30};
int num = 6;
int result;

result = binarySearch(arr,10,num);
if(result >= 0){
printf("查找成功,查找关键字对应的key是%d:",result);
}else{
printf("查找失败!");
}
return 0;
}
//二分查找主要实现代码
int binarySearch(int * arr,int n,int num){
int min = 0;
int max = n-1;
int mid;
while(min<=max){
mid = (min+max)/2;
if(arr[mid] > num){
max = mid-1;
}else if(arr[mid] < num){
min = mid+1;
}else{
return mid;
}
}
return -1;
}


可以看到如果查找表是顺序的话,二分查找的效率上比顺序查找会有一定的提升。其平均算法复杂度o(nlogn)。二分查找在很多地方都有实际应用的情况,比如mysql数据库中在leaf page页上查找数据的时候就用了二分查找法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: