acwing基础算法第一课

基础算法

一、排序(分治)

  1.快排:n*logn

    1.确定分界点。

    2.调整区间,左边小于x(可以是中间值、标记值),右边大于x。

    3.递归处理左右两段 。

      1.分为左右a[ ],b[ ]。

      2.判断当前元素大小(正序),若q(x)<x(小于x),x放在a[ ],反之,x放b[ ].(或用指针交换,更加优美。直接交换当前两个位置不对数)。

 

复制代码
 1 void quick_sort(int q[], int l, int r)
 2 {
 3     if (l >= r) return;
 4 
 5     int i = l - 1, j = r + 1, x = q[l + r >> 1];
 6     while (i < j)
 7     {
 8         do i ++ ; while (q[i] < x);
 9         do j -- ; while (q[j] > x);
10         if (i < j) swap(q[i], q[j]);
11     }
12     quick_sort(q, l, j), quick_sort(q, j + 1, r);
13 }
14 
15 作者:yxc
16 链接:https://www.acwing.com/blog/content/277/
17 来源:AcWing
18 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复制代码

   

  2.归并排序:logn*n

    1.确定分界点mid=(l+r)/2。

    2.递归排序左右两个区间left、right。

    3.归并--合二为一。left和right已是有序数组,因此,将同时便利两个数组,对两个数进行比较,小的数插入答案数组ans,并继续寻找。

复制代码
 1 void merge_sort(int q[], int l, int r)
 2 {
 3     if (l >= r) return;
 4 
 5     int mid = l + r >> 1;
 6     merge_sort(q, l, mid);
 7     merge_sort(q, mid + 1, r);
 8 
 9     int k = 0, i = l, j = mid + 1;
10     while (i <= mid && j <= r)
11         if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
12         else tmp[k ++ ] = q[j ++ ];
13 
14     while (i <= mid) tmp[k ++ ] = q[i ++ ];
15     while (j <= r) tmp[k ++ ] = q[j ++ ];
16 
17     for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
18 }
19 
20 作者:yxc
21 链接:https://www.acwing.com/blog/content/277/
22 来源:AcWing
23 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复制代码

 

二、二分

  1.整数二分:本质:边界

    1.mid=(l+r+1)/2,if(check(mid)),找右边,反之找左边。更新左边界或右边界,更新mid。

    

复制代码
 1 bool check(int x) {/* ... */} // 检查x是否满足某种性质
 2 
 3 // 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
 4 int bsearch_1(int l, int r)
 5 {
 6     while (l < r)
 7     {
 8         int mid = l + r >> 1;
 9         if (check(mid)) r = mid;    // check()判断mid是否满足性质
10         else l = mid + 1;
11     }
12     return l;
13 }
14 // 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
15 int bsearch_2(int l, int r)
16 {
17     while (l < r)
18     {
19         int mid = l + r + 1 >> 1;
20         if (check(mid)) l = mid;
21         else r = mid - 1;
22     }
23     return l;
24 }
25 
26 作者:yxc
27 链接:https://www.acwing.com/blog/content/277/
28 来源:AcWing
29 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复制代码

  2.浮点数二分:

    1.mid=(l+r)/2,if(check(mid)),找右边,反之找左边。更新左边界或右边界,更新mid。(对边界点的处理更加简单)。

复制代码
 1 bool check(double x) {/* ... */} // 检查x是否满足某种性质
 2 
 3 double bsearch_3(double l, double r)
 4 {
 5     const double eps = 1e-6;   // eps 表示精度,取决于题目对精度的要求
 6     while (r - l > eps)
 7     {
 8         double mid = (l + r) / 2;
 9         if (check(mid)) r = mid;
10         else l = mid;
11     }
12     return l;
13 }
复制代码

 

posted @   childde  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示