二分查找相关

#include <iostream>

#include <vector>

#include <stdlib.h>

using namespace std;

二分查找,无重复元素

template <typename T>

int BinarySearch(vector<T> nums, T target) {  //不含有重复元素

int low = 0, high = nums.size() - 1;

while(low <= high) {

int mid = low + (high - low)/2;

if(nums[mid] == target) return mid;

else if(nums[mid] > target) {

high = mid -1;

} else {

low = mid + 1;

}

}

return -1;

}


二分查找,包含重复元素,返回第一个

template <typename T>

int BinarySearchWithDup(vector<T> nums, int target) { //包含重复元素,返回第一个相同元素

int low = 0, high = nums.size() -1;

while(low <= high) {

int mid = low + (high - low) / 2;

if(nums[mid] < target) {

low = mid + 1;

} else {

high = mid - 1;

}

}

if(nums[low] == target) return low;

return -1;

}

upper_bound

template<typename T>

int upper_bound(vector<T> &nums, T target) { // 返回第一个大于target的元素

int low = 0, high = nums.size()-1;

while(low <= high) {

int mid = low + (high - low)/2;

if(nums[mid] <= target) { // 当等于target时应该到右半部份找

low = mid + 1;

} else {

high = mid - 1;

}

}

return low;

}

lower_bound

template<typename T>

int lower_bound(vector<T> &nums, int target) {   // 返回第一个大于或者等于target的元素

int low = 0, high = nums.size()-1;

while(low <= high) {

int mid = low + (high - low);

if(nums[mid] < target) low = mid + 1;  // 当等于target时应该到左边找

else high = mid - 1;

}

return low;

}

void fakeData(vector<int> &nums, int n) {

int base = 1;

for(int i = 0; i < n; i++) {

base += rand()%10;

cout<<base<<" ";

nums.push_back(base);

}

cout<<endl;

}

int main() {

vector<int> nums;

fakeData(nums, 100);

cout<<BinarySearchWithDup(nums, 57)<<endl;

cout<<upper_bound(nums, 57)<<endl;

cout<<lower_bound(nums, 57)<<endl;

return 0;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容