20151007

来源:互联网 发布:男人月薪4500 知乎 编辑:程序博客网 时间:2024/04/19 08:06

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

0 0
原创粉丝点击