【二分查找】用C语言实现一个有序数组的二分查找
2017-04-12 19:49
495 查看
什么是二分查找?
首先,二分查找也叫折半查找,它是对于一组有序(升序或降序)数列来说的,我们举例子说明这个思想。例如:猜数字游戏
随机给出1-100内的一个数字,请猜出这个数字
那我们不能随机没有规律的去猜,这时考虑二分查找的思想
例如38
第一次猜50,告诉你猜大了,那么此时就在1-50内折半
第二次猜25,告诉你猜小了,那么此时就在26-49内折半…以此类推
这就是二分查找的思想。
那么我们如何用c语言来编写实现它呢?
给出一个升序数组arr[10]={0,1,2,3,4,5,6,7,8,9},要求用二分查找的方法找出4。
那么第一次我们折半找到5,5>4
然后进行第二次折半找到2,2<4
进行第三次折半找到3,3<4
最后一次我们就找到了目标数字4
接下来我们用两种方式实现:
1、(此代码存在安全问题并可以优化)
#include<stdio.h> int binary_search(int arr[], int num, int sz)//二分查找函数 { int mid = 0;//折半后数字的下标 int left = 0;//左下标 int right = sz - 1;//右下标 while (left <= right)//判断当左下标小于右下标条件满足 { mid = (left + right)/2;//找出折半后数字下标(尽量不要用此方法) if (num <arr[mid]) right = mid; else if (num > arr[mid]) left = mid; else return mid;//找到目标数字并返回数组下标 } return -1;//左下标大于右下标没找到 } int main() { int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int num = 3; int sz = sizeof(arr) / sizeof(arr[0]);//求这个数组的大小 int tmp = binary_search(arr,num,sz); if (tmp != -1) printf("exist the number is:%d", tmp); else printf("no exist!"); return 0; }
2、这个代码更具体是代码一的优化 给出左右下标在这个范围内查找
#include<stdio.h> int binary_search(int arr[], int left, int right, int num)//二分查找函数 给出做右下标在此范围内找 { int mid = 0; while (left <= right) { mid = left + ((right - left) >> 1);//这样求中间的数的下标等安全>>为右移符号,右移1等于除以2 if (num <arr[mid]) right = mid; else if (num > arr[mid]) left = mid; else return mid; } return -1; } int main() { int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int num = 3; int tmp = binary_search(arr, 0, 6, num); if (tmp!=-1) printf("exist the number is:%d", tmp); else printf("no exist!"); return 0; }
相关文章推荐
- 在一个旋转过的有序数组上实现二分查找
- 二分法实现一个整形有序数组的二分查找
- python实现:使用二分查找,查找有序数组中,一个数字最后出现的下标
- 写一个函数,实现一个整形有序数组的二分查找。
- 写一个函数,实现一个整形有序数组的二分查找
- 在一个旋转过的有序数组上实现二分查找 收藏
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 数组封装应用及有序数组、二分查找源码实现
- C语言实现数组二分查找与顺序查找
- 实现有序列表(基于数组,二分查找)
- 输入连续有序数组,数组中有一个数字丢失,二分查找
- 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组
- 有序表查询之一:java实现整型数组二分查找
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- C语言实现 二分查找数组中的Key值(递归和非递归)
- 插入排序算法+优化 (二分查找优化有序部分)C语言实现
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 在一个循环有序的数组里查找特定值
- 在两个有序的数组中找第N个数,二分查找 O(lgm+lgn)级