二分法查找
前言
提示:该文旨在帮助自己理解二分法过程。
一、二分法的目的
需求:
从一组有序的数字中找出某个元素。
想法----------利用循环从第一个元素开始试,直到找出来这个数或者没有找到循环结束。
缺点:循环次数多,耗时长,
因此选择算法:
当数据量很大适宜采用该方法。采用二分法查找时,注意:数据需是排好序的。
二、二分法的细节点
1.基本思想
假设数据是按升序排序的,对于给定数据a,从序列的中间位置开始比较,
(1):如果当前位置值等于a,则查找成功;
(2):若a小于当前位置值,则在数列的前半段中查找,即从中间值往前找;
(3):若a大于当前位置值,则在数列的后半段中查找,即从中间值往后找;
(4):找到最后一个数和给定的数据不相等,则该数组中没有我们要找的值;
算法的时间复杂度:O(log(n)) 。
2.思路
举例说明:
1、给定一组有序数字:1,2,3,4,5,6,7,8,9,10。给定数值 7。
(1):确定中间数:5或者6;
(2):使用中间数5和要查找的数7作比较,中间数5小于要找的数7,确定数字在6,7,8,9,10中;
(3):然后用相同的方法,确定中间数为8,使用数字7 和8 进行比较,中间数8大于要找的数7,下一次在6,7中查找;
(4):选择6,7的中间数6或者7,和7 进行比较,,最终确定7的位置。
//确定数组即左右位置的下标
int array[10] = {1,2,3,4,5,6,7,8,9,10};
int left = 0;
int right = 9;
2、确定中间元素并进行范围查找
//找到中间元素下标
int mid = (left+right)/2;
//中间元素和要找的值进行比较
if(a[mid] > 7 ) {
//中间元素大于被查找数,范围缩小到前半部分,右位置下标挪到中间元素的前一个位置
right = mid - 1;
} else if(a[mid] < 7) {
//中间元素小于被查找数,范围缩小到后半部分,左位置下标挪到中间元素的后一个位置
left = mid + 1;
} else {
//中间元素和被查找数相等。
printf("index = %d\n", mid);
}
3、当不能一次找到时,需要进行多次循环
//不使用函数,只剖析过程
while(left <= right)
{
int mid = (left + right) / 2;
if(7 < a[mid]) {
right = mid - 1;
} else if(7 > a[mid]) {
left = mid + 1;
} else {
printf("index = %d\n", mid);
break;
}
}
if (left > right)
{
printf("该数组中不存在这个数\n");
}
return 0;