二分查找相关

2018-12-31  本文已影响0人  惺惺惜惺惺

#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;

}

上一篇下一篇

猜你喜欢

热点阅读