HZ集训日 day2 距CCFNOIP2015仅30d
考试题。。。。今天LHB考了几道比较扯的,就考了20分==QAQ,所以内心很纠结。。。
被Stdafx.h某某犇 YMX LGL 几个大神虐了。。
今天自己学习二分查找
于是窜进了STL里把代码搞了出来
自己和网上的对比和润色了一下
1.快速排序 nlogn
类似于二分查找吧 目测是除插入排序以外的c++最牛排序
但插排利用数组下标只能适用于小数据和非负整数
所以这个就很牛了
快排大家都直接调STL就行了 但是追求速度的oier还是需要掌握的
毕竟STL比手打慢
不说了 上代码
/*algorithm : quick sort[STL]*/
inline void qsort(int l,int r){//从小到大排序
int i,j,p,mid;
i=l,j=r;
mid=a[(l+r)>>1];
do{
while(a[i]<mid) i++;// 如果从大到小排序
while(a[j]>mid) j--;//就把这两行的大于小于对调
if(i<=j){
a[i]=p,a[i]=a[j],a[j]=p;
i++,j--;
}
}while(i<=j);
if(l<j) qsort(l,j);
if(i<r) qsort(i,r);
}
2. lowerbound 二分查找
STL里快速查找有序序列的方法
返回第一个大于等于key的位置
//lower_bound查询第一个大于等于key的数
int lower_bound(int *a, int size, int key)//size是数组的大小 {
int first=0,last=size-1;
int middle,pos=0; //需要用pos记录第一个大于等于key的元素位置
while(first<last){
middle=(first+last)>>1;
if(a[middle]<key){ //若中位数的值小于key的值,我们要在右边子序列中查找,这时候pos可能是右边子序列的第一个
first=middle+1;
pos=first;
}
else{
last=middle; //若中位数的值大于等于key,我们要在左边子序列查找,但有可能middle处就是最终位置,所以我们不移动last,
pos=last; //而是让first不断逼近last。
}
}
return pos;
}
3. upperbound二分查找
STL里快速查找有序序列的方法
返回最后一个大于等于key的位置
前提!!序列必须有序!否则会出错!
//upper_bound 查询最后一个大于等于key的数
int upper_bound(int *array, int size, int key){
int first=0,last=size-1;
int middle,pos=0;
while(first<last){
middle=(first+last)>>1;
if(array[middle]>key){ //当中位数大于key时,last不动,让first不断逼近last
last=middle;
pos=last;
}
else{
first=middle+1; //当中位数小于等于key时,将first递增,并记录新的位置
pos=first;
}
}
return pos;
}