问题4:如何使用递归与非递归实现二分查找?
来源:互联网 发布:阿里云域名变更 编辑:程序博客网 时间:2024/06/06 04:43
二分查找法也称为折半查找法,它的思想是每次都与序列的中间元素进行比较。
二分查找的一个前提条件是数组是有序的。假设数组array为递增序列,findData为
要找的数,n为数组长度,首先将n个元素分成个数大致相同的两半,取array[n/2]与
要查找的值findData进行比较,如果findData等于array[n/2],则找到findData,算法结束;
如果findData<array[n/2],则只要在数组array的左半部分继续查找findData;如果findData>array[n/2],
则只要在数组array的左半部分继续查找即可。
#include <stdio.h>//非递归算法,如果存在返回其在数组中的位置,不存在则返回-1int binarySearch(int a[], int len, int findData){ if(a == NULL || len <= 0) return -1; int start = 0; int end = len-1; while(start <= end) { int mid = start + (end-start)/2; if(findData == a[mid]) return mid; else if(findData > a[mid]) start = mid+1; else end = mid-1; } return -1;}//递归算法int binarySearchRecursion(int a[], int findData, int start, int end){ if(start > end) return -1; int mid = start + (end-start)/2; if(findData == a[mid]) return mid; else if(findData > a[mid]) return binarySearchRecursion(a, findData, mid+1, end); else return binarySearchRecursion(a, findData, start, mid-1);}int binarySearchRecursion1(int a[], int len, int findData){ if(a == NULL || len <= 0) return -1; return binarySearchRecursion(a, findData, 0, len-1);}int main(void){ int a[] = {1, 3, 4, 5, 6, 7, 8, 9}; int length = sizeof(a)/sizeof(a[0]); int index = binarySearch(a, length, 4); int index2 = binarySearchRecursion1(a, length, 10); printf("%d\n%d\n", index, index2); return 0;}
程序运行结果为:
2
-1
- 问题4:如何使用递归与非递归实现二分查找?
- 二分查找递归与非递归实现
- 二分查找,递归与非递归实现
- 二分查找非递归与递归实现
- 二分查找递归与非递归实现
- 如何分别使用递归与非递归实现二分查找算法
- 二分查找的递归与非递归实现
- 二分查找的递归与非递归实现
- C++ 二分查找的递归与非递归实现
- 二分查找算法的递归与非递归实现
- 二分查找(递归与非递归两种方法实现)
- 二分查找的非递归与递归实现
- PHP实现二分查找(递归与非递归)
- 二分查找的递归与非递归实现
- PHP递归与非递归实现二分查找
- 二分查找(递归与非递归实现)
- 二分查找的递归与非递归实现
- 二分查找算法(递归与非递归实现)
- Log
- JSP技术在开发当中的应用
- C语言中可变参数函数实现原理浅析
- ios block
- spring ioc原理(看完后大家可以自己写一个spring)
- 问题4:如何使用递归与非递归实现二分查找?
- redhat5.8安装 oracle10g之 DBCA建库
- 用宏确实比用函数效率高
- [转]opencv轮廓提取(findcontours函数详解)
- 关于java的内部类---由迭代器是实现引出
- Java中事务的处理
- PB开发还有前途吗
- Android Looper和Handler分析
- 地球已经阻止不了程序员学cocos2d-x了(一)