两种简单查找算法之顺序查找和二分查找
2013-09-07 14:08
423 查看
查找对于计算机编程来说是非常常见的功能。对于当今的大信息数据时代,计算机对于查找的性能又有了新的挑战,如何设计一个高效的查询,对于系统的性能有着举足轻重的影响。下面我们就来看下最简单的两种查找算法。
顺序查找称得上是最简单的查找算法,其算法思想也比较简单。就是线性表的一段开始,依次将线性表中的数据拿来与需要查找的关键字比较,如果线性表中某个记录的关键字等于给定值,那么查找成功;如果线性表已经遍历完了,还没有查找到对应记录的话,则查找失败。
顺序查找的思路很简单,下面给出c语言的代码形式:
上面的代码很简单。但是他有一定的好处,就是对查找表中的顺序是没有限制的;但是坏处也很明显,因为都要依次给查找表中的数据做对比,所以最坏情况下查找成功需要进行n次比较。数据量大的时候,绝对是不可能考虑的查找算法。
上面看完了顺序查找,下面再来看一下二分查找。二分查找的思路也比较简单,但是它有一个限制,就是查找表必须是一个顺序集合。二分查找的总体思路是,先拿查找表中的一个中间元素与被查找值进行比较,这里可能有三种情况:
1.中间元素恰好等于了被查找值,这时查找成功。
2.中间元素的值小于被查找值,则让它在查找表的后半部分继续进行二分查找。
3.中间元素的值大于被查找值,则让它在查找表的前半部分继续进行二分查找。
如果进行到最后,还没有找到被查找元素的话,那么这次证明查找表中没有被查找的元素,则查找失败。
二分查找在本质上类似于递归的过程,就是在大的方向找不到的话就去小的方向找,直到末尾。下面给出二分查找的代码:
可以看到如果查找表是顺序的话,二分查找的效率上比顺序查找会有一定的提升。其平均算法复杂度o(nlogn)。二分查找在很多地方都有实际应用的情况,比如mysql数据库中在leaf page页上查找数据的时候就用了二分查找法。
顺序查找称得上是最简单的查找算法,其算法思想也比较简单。就是线性表的一段开始,依次将线性表中的数据拿来与需要查找的关键字比较,如果线性表中某个记录的关键字等于给定值,那么查找成功;如果线性表已经遍历完了,还没有查找到对应记录的话,则查找失败。
顺序查找的思路很简单,下面给出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页上查找数据的时候就用了二分查找法。
相关文章推荐
- 查找算法系列之简单查找:顺序查找、二分查找、分块查找
- 查找算法系列之简单查找:顺序查找、二分查找、分块查找
- Java实现的两种常见简单查找算法示例【快速查找与二分查找】
- 查找算法:二分查找、顺序查找
- 查找算法总结(顺序查找、二分查找、二叉树、平衡二叉树、红黑树、散列表hash)
- 查找算法总结(顺序查找、二分查找、二叉树、平衡二叉树、红黑树、散列表hash)
- 基本查找算法 PHP 实现 保存 顺序查找,二分查找 分块查找
- 查找算法总结之顺序查找、二分查找、静态树查找
- (五)数据结构之静态查找的简单实现:顺序查找和二分查找
- 【算法分析】查找算法:二分查找、顺序查找
- 2. C#数据结构与算法 -- 查找算法(顺序查找,哈希查找,二分查找(折半),索引,二叉)
- 黑马程序员——Java基础查找算法:顺序查找和二分查找
- 三种静态查找算法:顺序、二分/折半、索引/分块查找
- 查找算法一之顺序查找 二分查找
- 01_查找算法_顺序查找_二分查找
- 查找算法(I) 顺序查找 二分查找 索引查找
- 【数据结构】查找算法:二分查找、顺序查找
- 查找算法(I) 顺序查找 二分查找 索引查找
- 查找算法之顺序查找和二分查找
- 查找算法总结:顺序查找,二分查找,分块查找,散列查找,二叉排序树查找