//二分查找 :必须是有序序列,若为无序,可以先进行排序
//在首元素和末尾元素分别放两个‘’指针‘’指向,然后通过判断中间元素与要查找的元素,来实现折半查找
//查找值为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;
}
}