排序-归并
分而治之的思想:
分:二分
治:将相邻的两个有序数组进行合并;可以采用临时数组配合双指针进行排序也可以快排。
1 void merge(vector<int>& init, int start, int mid, int end) { 2 // 两个有序数组的合并,一个数组一个指针 3 vector<int> tmp; // 临时数组记录两个数组的排序结果 4 int i = start, j = mid + 1; 5 while (i <= mid && j <= end) { // 任意一个数组遍历完成就不用再遍历了 6 if (init[i] < init[j]) { 7 tmp.push_back(init[i]); ++i; // 把最小值插入向量,再继续比较得到最小值 8 } 9 else { 10 tmp.push_back(init[j]); ++j; 11 } 12 } 13 // 如果还有一个没遍历完成,不管是谁的,肯定都是最大的元素了,直接移动到tmp就ok 14 while (i <= mid) { tmp.push_back(init[i]); ++i; } 15 while (j <= end) { tmp.push_back(init[j]); ++j; } 16 // 将tmp数组放入原来的数组 17 for (int i = start; i <= end; ++i) { 18 init[i] = tmp[i - start]; 19 } 20 } 21 22 // 归并 分(二分)而治(合并排序)之 23 // 参数列表里可以不写临时数组吗 24 void sort(vector<int>& init, int start, int end) { 25 if (start >= end) return; 26 int mid = (start + end) / 2; 27 sort(init, start, mid); 28 sort(init, mid + 1, end); 29 merge(init, start, mid, end); 30 } 31 32 int main() { 33 vector<int> init = { 3,2,6,7,1,3,5,100,38,101,0 }; 34 // merge(init, 0, 0, 1); 35 sort(init,0,init.size()-1); 36 for (int i = 0; i < init.size(); ++i) { 37 cout << init[i]<< " "; 38 } 39 return 0; 40 }
心之所愿,永不相忘
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
· 从 Windows Forms 到微服务的经验教训