二分查找

//二分查找 :必须是有序序列,若为无序,可以先进行排序
//在首元素和末尾元素分别放两个‘’指针‘’指向,然后通过判断中间元素与要查找的元素,来实现折半查找
//查找值为p的元素,若找到,返回这个元素的下标和值,否则返回-1

#include<bits/stdc++.h>
using namespace std;
void Sortarray(int a[],int N)
{
	int i,j,t;
	for(i=1;i<N;i++){//插入排序 
		t=a[i];
		for(j=i-1;j>=0;j--){
			if(a[j]>t){
				a[j+1]=a[j];
			}
			else{
				break;
			}
		}
		a[j+1]=t;
	}	
} 
int BinarySearch(int a[],int N,int key)
{
	int L=0,mid,t=-1;//左端点 
	int R=N-1;//右端点
	while(L<=R){
		mid=L+(R-L)/2;//中间元素下标 
		if(a[mid]>key){
			R=mid-1;//右端点前移 
		}
		else if(a[mid]<key){
			L=mid+1;//左端点后移 
		}
		else{
			t=mid;//接收查找到的元素下标 
			break;
		}
	} 
	return t; 
}
int main()
{
	int N,t,key; 
	cout<<"请输入数组长度N:"; 
	cin>>N;
	int *a;
	a=(int *)malloc(sizeof(int)*N);
	cout<<"请输入数组元素";
	for(int i=0;i<N;i++){
	cin>>a[i];
	}
	cout<<"请输入要查找的元素key:";
	cin>>key; 
	Sortarray(a,N);//排序 
	t=BinarySearch(a,N,key);//二分查找 
	cout<<t<<endl;//输出
	cout<<a[t]<<endl; 
	return 0;
}

//找比给定整数key小的,下标最大的元素

#include<bits/stdc++.h>
using namespace std;
void Sortarray(int a[],int N)
{
	int i,j,t;
	for(i=1;i<N;i++){//插入排序 
		t=a[i];
		for(j=i-1;j>=0;j--){
			if(a[j]>t){
				a[j+1]=a[j];
			}
			else{
				break;
			}
		}
		a[j+1]=t;
	}	
} 
int BinarySearch(int a[],int N,int key)
{
	int L=0,mid,t=-1;//左端点 
	int R=N-1;//右端点
	while(L<=R){
		mid=L+(R-L)/2;//中间元素下标 
		if(a[mid]>=key){
			R=mid-1;//右端点前移 
		}
		else{
			t=mid;//每次更新t为比key小的元素下标 
			L=mid+1;//左端点后移 
		}
	} 
	return t; 
}
int main()
{
	int N,t,key; 
	cout<<"请输入数组长度N:"; 
	cin>>N;
	int *a;
	a=(int *)malloc(sizeof(int)*N);
	cout<<"请输入数组元素";
	for(int i=0;i<N;i++){
	cin>>a[i];
	}
	cout<<"请输入要查找的元素key:";
	cin>>key; 
	Sortarray(a,N);//排序 
	t=BinarySearch(a,N,key);//二分查找 
	cout<<t<<endl;//输出
	cout<<a[t]<<endl; 
	return 0;
} 

//二分查找的递归实现

#include<bits/stdc++.h>
using namespace std;
int BinarySearch(int a[],int Left,int Right,int key)
{
	int mid;
	if(Left>Right){//没找到与key值相等的元素
		return -1;
	}
	else{//查找与key相等的元素
		mid=Left+(Right-Left)/2;//二分
		if(a[mid]==key){//找到返回下标
			return mid;
		}
		else if(a[mid]<key){//说明值小了,指针要右移到mid+1,这是一个重复的查找过程,因此递归
			return BinarySearch(a,mid+1,Right,key);
		}
		else{//同上
			return BinarySearch(a,Left,mid-1,key);
		}
	}
}
int main()
{
	int n,key;
	int *a;
	cout<<"请输入数组长度:";
	cin>>n; 
	a=(int *)malloc(n*sizeof(int));
	cout<<"请输入数组元素:";
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cout<<"请输入key:";
	cin>>key;
	sort(a,a+n);//调用排序函数 
	int t=BinarySearch(a,0,n-1,key);
	if(t!=-1){
	cout<<t<<endl;
	}
	else{
		cout<<"Not Found!"<<endl;
	}
	return 0;
} 
//二分查找变形
public class BinarySearch2 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.print("请输入数组长度:");
		int n = in.nextInt();
		System.out.print("请输入数组元素:");
		int[] nums = new int[n];
		for (int i = 0; i < nums.length; i++) {
			nums[i] = in.nextInt();
		}
		System.out.print("请输入要查找的元素:");
		int key = in.nextInt();
		Arrays.sort(nums);
		System.out.println(binarySearch(nums, key));
	}
	
	//变体一:查找第一个值等于给定值的元素
	/*public static int binarySearch(int[] nums,int key) {
		int left = 0;
		int right = nums.length-1;
		int mid;
		while(left<=right){
			mid = left+(right-left)/2;
			if (nums[mid] < key) {
				left = mid + 1;
			}else if (nums[mid] > key) {
				right = mid - 1;
			}else{
				if ((mid==0)||(nums[mid-1]!=key)) {
					return mid;
				}else{
					right = mid - 1;
				}
			}
		}
		return -1;
	}*/
	
	//变体二:查找最后一个值等于给定值的元素
	/*public static int binarySearch(int[] nums,int key) {
		int left = 0;
		int right = nums.length-1;
		int mid;
		while(left<=right){
			mid = left+(right-left)/2;
			if (nums[mid] < key) {
				left = mid + 1;
			}else if (nums[mid] > key) {
				right = mid - 1;
			}else{
				if ((mid==nums.length-1)||(nums[mid+1]!=key)) {
					return mid;
				}else{
					left = mid + 1;
				}
			}
		}
		return -1;
	}*/
	
	//变体三:查找第一个大于等于给定值的元素
	/*public static int binarySearch(int[] nums,int key) {
		int left = 0;
		int right = nums.length-1;
		int mid;
		while(left<=right){
			mid = left+(right-left)/2;
			if (nums[mid] >= key) {
				if ((mid==0)||(nums[mid-1]<key)) {
					return mid;
				}else{
					right = mid - 1;
				}
			}else{
				left = mid + 1;
			}
		}
		return -1;
	}*/
	
	//变体四:查找最后一个小于等于给定值的元素
	public static int binarySearch(int[] nums,int key) {
		int left = 0;
		int right = nums.length-1;
		int mid;
		while(left<=right){
			mid = left+(right-left)/2;
			if (nums[mid] <= key) {
				if ((mid==nums.length)||(nums[mid+1]>key)) {
					return mid;
				}else{
					left = mid + 1;
				}
			}else{
				right = mid - 1;			
				}
		}
		return -1;
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值