二元搜索

本文展示了一个简单的C++程序,该程序实现了选择排序算法来对整数数组进行排序,并使用二分搜索算法来查找特定元素的位置。通过具体示例说明了这两种基本算法的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream.h>

void ChoiceSort(int list[], int len);
void Swap(int&, int&);
int BinarySearch(int list[],int key, int len);
int Comp(int, int);

void main()
{
	const int SIZE=15;
	int list[SIZE]={10,15,20,30,3,
					16,18,500,21,25,
					32,56,47,56,90 };
	ChoiceSort(list, SIZE);
	cout<<"list :  ";
	for (int idx=0; idx<SIZE; idx++ )
		cout<<list[idx]<<"  ";
	cout<<endl;

	int key;
	cout<<"enter the search key : ";
	cin>>key;

	int index=BinarySearch(list, key,SIZE);
	if (index != -1)
		cout<<key<<" the index in list is :: "<<index+1<<endl;
	else
		cout << "can't found it "<<endl;

	//上面cin>>key,在输入搜索数字后的回车会被第一个cin.get()读取,当读取后就直接退出了
	//所以最好再加上一个cin.get()
	cin.get();
	cin.get();
}

void ChoiceSort(int list[], int len)
{
	int out_recy, in_recy; //min_v ;
	for(out_recy=0; out_recy<len-1;out_recy++)
	{
		//min_v=out_recy;
		for (in_recy=out_recy+1; in_recy<len; in_recy++)
		//	if (list[in_recy]<list[min_v])
		//	{
		//		min_v=in_recy;
		//	}
			if (list[out_recy]>list[in_recy])
				Swap(list[in_recy], list[out_recy]);
	}
}
int BinarySearch(int list[],int key, int len)
{
	int left=0,right=len-1,mid ;
	//int mid=(left+right)/2;
	if (key == list[0])
		return 0;
	if (key == list[len-1])
		return len-1;
	while(left<=right)
	{
		mid=(left+right)/2;
		switch( Comp(list[mid], key) )
		{
		case 2:
			right=mid-1;
			break;

		case 1:
			left=mid+1;
			break;

		case 0 :
			return mid ;
		}
		
	}
	return -1;
}
int Comp(int mid_v, int key_v)
{
	if (mid_v>key_v)
		return 2 ;
	else if (mid_v<key_v)
		return 1;
	else
		return 0 ;
}

void Swap(int& small, int& big)
{
	int temp=small;
	small=big;
	big=temp;
}

### 关于二元搜索算法及其改进 #### 传统二元搜索算法实现 二元搜索是一种高效的查找算法,在已排序数组中工作良好。其基本原理是从中间元素开始比较,如果中间位置的值等于要找的目标,则返回索引;如果不相等,则继续在左半部分或右半部分重复上述过程。 以下是Python中的经典二元搜索实现: ```python def binary_search(arr, target): low, high = 0, len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid elif arr[mid] < target: low = mid + 1 else: high = mid - 1 return -1 ``` #### 改进一:插值查找法 为了提高效率,特别是在数据分布较为均匀的情况下,可以采用插值查找代替简单的取中位数策略。这种方法基于线性内插来预测目标的位置,从而减少不必要的迭代次数。 ```python def interpolation_search(arr, target): low, high = 0, len(arr) - 1 while low <= high and target >= arr[low] and target <= arr[high]: pos = low + ((target - arr[low]) * (high - low)) // (arr[high] - arr[low]) if arr[pos] == target: return pos elif arr[pos] < target: low = pos + 1 else: high = pos - 1 return -1 ``` #### 改进二:斐波那契查找 此方法利用了斐波那契序列特性来进行分割操作,相比传统的二分查找能够更好地处理某些特定类型的输入集。它减少了每次划分时所需的除法运算量,并且对于接近黄金比例的数据结构特别有效。 ```python import math def fibonacci_search(arr, target): fib_m_minus_2 = 0 fib_m_minus_1 = 1 fib_M = fib_m_minus_2 + fib_m_minus_1 # 找到最小的大于或等于len(arr) 的斐波那契数fib_M while fib_M < len(arr): fib_m_minus_2 = fib_m_minus_1 fib_m_minus_1 = fib_M fib_M = fib_m_minus_2 + fib_m_minus_1 offset = -1; while fib_M > 1: i = min(offset+fib_m_minus_2, len(arr)-1) if arr[i] < target: fib_M = fib_m_minus_1 fib_m_minus_1 = fib_m_minus_2 fib_m_minus_2 = fib_M - fib_m_minus_1 offset = i elif arr[i] > target: fib_M = fib_m_minus_2 fib_m_minus_1 = fib_m_minus_1 - fib_m_minus_2 fib_m_minus_2 = fib_M - fib_m_minus_1 else : return i if fib_m_minus_1 and arr[offset+1]==target: return offset+1; return -1 ``` 这些变体都试图通过不同的方式优化标准二叉树形遍历路径的选择机制,进而达到加速定位的目的[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值