Basic Agorithm ( ONE ).
发布日期:2022-02-24 01:06:47
浏览次数:7
分类:技术文章
本文共 3543 字,大约阅读时间需要 11 分钟。
basic algorithm one
quick_sort
基本思想:分治(divide and conquer)
步骤:
- 确定分界点 q[ l ] , q[ r ] , q[l + r >> 1] 随机 皆可,但是为了防止边界越界的问题,建议选择q[l + r >> 1] 为基准点( pivot ).
- 调整区间,使得小于基准点的数位于基准点的左边,大于基准点的数位于基准点的右边。
- 递归处理左右两端 模版(template):
#includeusing namespace std;const int maxn = 100 + 5;void quick_sort(int q[],int l,int r){ if(l >= r) return ; int x = q[l + r >> 1]; int i = l -1 , j = r + 1; while(i < j) { do i++; while(q[i] < x) ; do j--; while(q[j] > x) ; if(i < j) swap(q[i] , q[j]); } quick_sort(q,l,j); quick_sort(q,j+1,r);}int main(){ int arr[maxn]; int n; scanf("%d",&n); for(int i = 0; i < n;i++) scanf("%d",&arr[i]); quick_sort(arr,0,n-1); for(int i = 0;i < n;i++) printf("%d ",arr[i]); printf("\n"); return 0;}
merge_sort
基本思想:分治(divide and conquer)
步骤:- 确定分界点 mid = l + r >> 1;
- 递归排序 left , right
- 归并 —— 合二为一
模版(template):
#includeusing namespace std;const int maxn = 100 + 5;int temp[maxn];void merge_sort(int q[],int l,int r){ if(l >= r) return ; int mid = l + r >> 1; merge_sort(q,l,mid) ; merge_sort(q,mid+1,r); int k = 0, i = l, j = mid + 1; while(i <= mid && j <= r) if(q[i] <= q[j]) temp[k++] = q[i++]; else temp[k++] = q[j++]; // 将剩余的元素补到数组的后面 while(i <= mid) temp[k++] = q[i++]; while(j <= r) temp[k++] = q[j++]; for(int i = l,j = 0;i <= r;i++,j++) q[i] = temp[j];}int main(){ int arr[maxn]; int n; scanf("%d",&n); for(int i = 0;i < n;i++) scanf("%d",&arr[i]); merge_sort(arr,0,n-1); for(int i = 0;i < n;i++) printf("%d ",arr[i]); printf("\n"); return 0;}
binary_search
二分中需要注意的一点:
有单调性一定可以二分,可以二分的不一定有单调性。 作用: 如果存在一种性质,可以使得一个区间一分为二,一边满足这个性质,另一边不满足这个性质,二分则可以找到其边界。整数二分:
需要注意的地方:因为 c/c+++ 是向下取整,当 l == r - 1 的时候 ,if(check(x)) == true 这个时候 l == mid == l + r >> 1 == l 这样就会造成死循环 ,所以此时需要在l + r 的后面加1 防止造成死循环。所以这时需要考虑其边界,只需记住一点,当 l == mid 的时候,此时 L + R >> 1 需要在 L + R 上加上一,防止造成边界死循环的问题。
题目可能无解,但二分一定有解,通过性质判定所得无解 —》 进一步推出元问题无解。模版:
对于一个给定的上升序列,有q次查询,每次查询一个数,返回该数的起始位置和终止位置,如果没有则返回“-1 -1”。 AC Code:#includeusing namespace std;const int maxn = 1e6 + 10; int arr[maxn];int n , m;int main(){ scanf("%d %d",&n,&m); for(int i = 0;i < n;i++) scanf("%d",&arr[i]); while(m--) { int x ; scanf("%d",&x); int ss = 0 , ee = 0; int l = 0, r = n - 1; // 找起始位置 while( l < r ) { int mid = l + r >> 1; if(arr[mid] >= x) r = mid; else l = mid + 1; } ss = l; // 如果没找到该元素 则返回 if(arr[l] != x) { cout << "-1 -1" << endl; continue; } else { l = 0, r = n - 1; // 找终点位置 while(l < r) { int mid = l + r + 1 >> 1; if(arr[mid] <= x) l = mid; else r = mid - 1; } ee = l; } cout << ss + 1 << " " << ee + 1 << endl; } return 0;}
浮点数二分:
在c/c++ 中浮点数的除法是精确的,所以对浮点数进行二分时,每次二分都能严格缩小一半,不需要去考虑边界问题。
当二分的边界足够小的时候,可以认为它是一个数(ans)。 R – L <= 1e-6。预留的空间至少要比题目所要求的位数多2,ex:题目要求保留5位小数,这是至少要算到 L – R <= 1e-7。 这样才不会造成精度问题(数据丢失)。 或者可以直接暴力循环100次,这样也不需要考虑精度问题,因为这样等于除了2^100,指数级非常大,除完之后是一个很小很小的数。此时不需要考虑精度问题.模版:
给定一个浮点数,计算其开平方根。Code:
#includeusing namespace std;int main(){ double x ; cin >> x; double l = 0, r = x; // 当小于所需精度时,则一直二分 直到结果小于所需的精度 while( r - l > 1e-6 ) { // 注意: 浮点数不能进行位运算操作 double mid = (l + r) / 2; if(mid * mid >= x) r = mid; else l = mid; } cout << l << endl; return 0;}
转载地址:https://blog.csdn.net/weixin_45877540/article/details/108048667 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月04日 05时11分36秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
图的几种存储方式(邻接矩阵+邻接表+vector)
2019-04-26
[LeetCode] 67. 二进制求和(简单模拟二进制求和)
2019-04-26
HDU1233(基础最小生成树 prim和 kruskal)
2019-04-26
「图解」ThreadLocal 在并发问题中的应用
2019-04-26
终于找到可以一文多发的平台了!
2019-04-26
IntelliJ IDEA 2019 快捷键终极大全,速度收藏!
2019-04-26
世界很大,先从这几个公众号看起!
2019-04-26
真实的上海IT圈:张江男vs漕河泾男
2019-04-26
你还在认为 count(1) 比 count(*) 效率高?
2019-04-26
Master、Slave等术语将不能在未来的Linux代码中使用
2019-04-26
在Redis中设置了过期时间的Key,需要注意哪些问题?
2019-04-26
干掉 GuavaCache:Caffeine 才是本地缓存的王
2019-04-26
Spring Boot 2.x基础教程:EhCache缓存的使用
2019-04-26
如何让你的Nginx 提升10倍性能?
2019-04-26
神奇的 SQL,Group By 真扎心,原来是这样!
2019-04-26
我们常用的 Integer 内部为什么会去实现 Comparable 接口?
2019-04-26
Serverless:为我们到底带来了什么
2019-04-26
每日一皮:地铁上打瞌睡的程序员...
2019-04-26
每日一皮:996标配工位原来是这样的!
2019-04-26
Apache Shiro 1.6.0 发布!修复绕过授权高危漏洞
2019-04-26