二分法真的不那么简单,主要利用边界变换,实现了二分法的各个变种。
这里假定查找区按升序排列(arr数组成员递增)
1.找出第一个与key相等的元素
int *binary_search(int *arr, int key,int n)
{
int left = 0, right = n-1;
while(left<=right) {
int mid = (left + right)/2;
if(arr[mid] >= key) right = mid - 1;
else left = mid + 1;
}
if(left < n && arr[left] == key)
return &arr[left];
return NULL;
}
2.找出最后一个与key相等的元素
int *binary_search(int *arr, int key,int n)
{
int left = 0, right = n-1;
while(left<=right) {
int mid = (left + right)/2;
if(arr[mid] > key) right = mid - 1;
else left = mid + 1;
}
if(right >= 0 && arr[right] == key)
return &arr[right];
return NULL;
}
- 查找第一个等于或者大于Key的元素
int *binary_search(int *arr, int key,int n)
{
int left = 0, right = n-1;
while(left<=right) {
int mid = (left + right)/2;
if(arr[mid] >= key) right = mid - 1;
else left = mid + 1;
}
if(left > n)
return NULL;
return &arr[left];
}
4.查找第一个大于key的元素
int *binary_search(int *arr, int key,int n)
{
int left = 0, right = n-1;
while(left<=right) {
int mid = (left + right)/2;
if(arr[mid] > key) right = mid - 1;
else left = mid + 1;
}
if(left > n)
return NULL;
return &arr[left];
}
5.查找最后一个等于或者小于key的元素
int *binary_search(int *arr, int key,int n)
{
int left = 0, right = n-1;
while(left<=right) {
int mid = (left + right)/2;
if(arr[mid] > key) right = mid - 1;
else left = mid + 1;
}
if(right < 0)
return NULL;
return &arr[right];
}
6.查找最后一个小于key的元素
int *binary_search(int *arr, int key,int n)
{
int left = 0, right = n-1;
while(left<=right) {
int mid = (left + right)/2;
if(arr[mid] >= key) right = mid - 1;
else left = mid + 1;
}
if(right < 0)
return NULL;
return &arr[right];
}