03 | 桶排序和归并排序
分治算法
概念
在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题.....直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
步骤
分治法在每-层递归上都有三个步骤:
- 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
- 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
- 合并:将各个子问题的解合并为原问题的解。
归并排序
递归过程
归并过程
代码
#include <cstdio> #include <cstdlib> #include <iostream> using namespace std; const int N = 1e4 + 10; int is1[N], is2[N]; void merge(int low, int mid, int high) { /*具体归并的过程*/ int i = low, j = mid + 1, k = low; while (i <= mid && j <= high) { if (is1[i] < is1[j]) is2[k++] = is1[i++]; else is2[k++] = is1[j++]; } /*假如第一个序列有剩余*/ while (i <= mid) is2[k++] = is1[i++]; while (j <= high) is2[k++] = is1[j++]; /*拷贝回原数组*/ for (int i = low; i <= high; i++) is1[i] = is2[i]; } void mergesort(int a, int b) { /*递归出口*/ if (a >= b) return; /*分治*/ int mid = (a + b) / 2; mergesort(a, mid); mergesort(mid+1, b); /*合并*/ merge(a, mid, b); } int main() { int n; cin >> n; for (int i = 1; i <= n; i++) cin >> is1[i]; //归并排序 mergesort(1, n); for (int i = 1; i <= n; i++) cout << is1[i] << " "; system("pause"); return 0; }
桶排序
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int a[11], i, j, t; memset(a, 0, sizeof(a)); //将每一个桶初始化为0 for (i = 1; i <= 5; i++) { //读入5个数字,每个数字满足小于桶的个数 scanf("%d", &t); a[t]++; } for (i = 0; i < 11; i++) { for (j = 1; j <= a[i]; j++) printf("%d ", i); //出现了几次就打印几次 } system("pause"); return 0; }
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)