C++二分遍历

代码存档

#include<iostream>
using namespace std;
//数组查找的二分遍历法
//传入参数:数组本身arr,数组内寻找的元素K,数组长度n
int binary(int* arr, int K, int n) {
	//头下标与尾下标
	int front = -1;
	int rear = n;
	//当数组不是空的时候进行二分遍历
	while (front + 1 != rear) {
		//找到数组中间下标(中间大)
		int i = (front + rear) / 2;
		
		if (K < arr[i]) {
			rear = i;
		}
		if (K>arr[i])
		{
			front = i;
		}
		if(K==arr[i])
		{
			return i;
		}
	}
}
int main() {
	int array[16] = { 11,13,21,26,29,36,40,41,45,51,54,56,65,72,77,83 };
	int n = sizeof(array) / sizeof(array[0]);
	cout << binary(array, 45, n) << endl;
	system("pause");
	return 0;
}

原理分析:

二分遍历与顺序遍历的方法明显不同。顺序遍历的时间代价比较大,代码为:

int Sequential(int* arr, int K, int n) {
	for (int i = 0; i < n; i++)
	{
		if (K==arr[i])
		{
			return i;
		}
	}
}

顺序遍历,逐一比对,返回元素下标。但是i需要每一个元素都进行遍历。

二分遍历原理分析

1. 存储数组

2. 设置浮标front与rear用于存放首元素下标与尾部元素下标

3. 判断循环条件:头部下标和尾部下标不相邻

此时没有遍历的必要。

4. 二分遍历:

(1)找到中间值下标:

int i = (front + rear) / 2;

注意是整型,奇数除以2取小值

(2)比对,当值大于中值时,头下标等于中值下标;当值小于中值时,尾部下标等于中值下标;当值等于中值时,返回中值下标。以此类推。

 

一次循环可以左右遍历,直到找到合适的值的下标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值