没事写了写怎么实现的二分的小操作
#include <iostream>
using namespace std;
const int N = 10000;
int a[N],b[N];
void Sort(int l,int r,int a[]){ //归并
int mid = (l+r) >> 1;
if(l == r) return ;
Sort(l,mid,a);
Sort(mid+1,r,a);
int i = l,t = l,j = mid+1;
while(i <= mid && j <= r){
if(a[i] < a[j]){
b[t++] = a[i++];
}else
b[t++] = a[j++];
}
while(i <= mid) b[t++] = a[i++];
while(j <= r) b[t++] = a[j++];
for(i = l;i<=r;i++) a[i] = b[i];
}
int search(int l,int r,int k){ //标准查找,找不到返回-1
while(l <= r){
int mid = (l+r) >> 1;
if(a[mid] == k) return mid;
else if(a[mid] > k) r = mid-1;
else l = mid+1;
}
return -1;
}
int lower_search(int l,int r,int k){
int n = r;
while(l <= r){
int mid = l + (r - l) / 2;
if(k <= a[mid]) r = mid-1;
else l = mid + 1;
}
return l > n ? -1:l;
}
int lower__search(int l,int r,int k){
while(l < r){
int mid = (l+r) / 2;
if(k < a[mid]) r = mid;
else l = mid + 1;
}
return l;
// return a[l]!= a[k] ? -1 : l;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,k;
cin >> n >> k;
for(int i = 1;i<=n;i++) cin >> a[i];
Sort(1,n,a);
for(int i = 1;i<=n;i++) cout << a[i] << " \n"[i == n];
cout << "标准二分查找:" << endl;
cout << search(1,n,k) << endl;
cout << "查找第一个大于k的位置: " << endl;
cout << lower_search(1,n,k) << endl;
cout << "查找第一个大于k的位置(清新脱俗版,不过找不到的时候也是需要判断一下的): " << endl;
cout << lower__search(1,n,k) << endl;
return 0;
}
/*
5 9
3 5 7 2 4
2 3 4 5 7
*/