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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)