您的位置:首页 > 编程语言

编程之美3-11程序改错

2017-02-24 21:33 253 查看
二分查找你针对有序序列而言的一种查找算法,关于二分查找有一下的几类问题:

1. 给定一个有序(不降序)数组arr,求任意一个i使得arr[i]等于v,不存在则返回-1

#include <iostream>
using namespace std;
int binarySearch(int A[], int left, int right, int t)
{
int m;
while(left <= right){
m = left + (right - left) / 2;
if(A[m] < t)
left = m + 1;
else if(A[m] > t)
right = m - 1;
else
return m;
}
return -1;
}
int main()
{
int A[] = {1,2,2,2,3,4,5,6,7};
cout << binarySearch(A, 0, 8, 2);
return 0;
}


2.给定一个有序(不降序)数组arr,求最小的i使得arr[i]等于v,不存在则返回-1

#include <iostream>
using namespace std;
int binarySearch(int A[], int left, int right, int t)
{
int m;
while(left < right){
m = left + (right - left) / 2;
if(A[m] < t)
left = m + 1;
else if(A[m] > t)
right = m - 1;
else
right = m;
}
if(A[right] == t)
return right;
else if(A[left] == t)
return left;
else
return -1;
}
int main()
{
int A[] = {2,3};
cout << binarySearch(A, 0, sizeof(A) / sizeof(A[0]) - 1, 3);
return 0;
}


3.给定一个有序(不降序)数组arr,求最大的i使得arr[i]等于v,不存在则返回-1

#include <iostream>
using namespace std;
int binarySearch(int A[], int left, int right, int t)
{
int m;
while(left < right - 1){
m = left + (right - left) / 2;
if(A[m] < t)
left = m + 1;
else if(A[m] > t)
right = m - 1;
else
left = m;
}
if(A[right] == t)
return right;
else if(A[left] == t)
return left;
else
return -1;
}
int main()
{
int A[] = {2,3};
cout << binarySearch(A, 0, sizeof(A) / sizeof(A[0]) - 1, 3);
return 0;
}


4.给定一个有序(不降序)数组arr,求最大的i使得arr[i]小于v,不存在则返回-1

5.给定一个有序(不降序)数组arr,求最小的i使得arr[i]大于v,不存在则返回-1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: