《算法导论》——MergeSort
前言:
在今后的日子里,我将持续更新博客,讨论《算法导论》一书中的提到的各算法的C++实现。初来乍到,请多指教。
今日主题:
今天讨论《算法导论》第二章算法基础中的归并排序算法。下面是该算法的代码Merge.h:
#include <stdlib.h> namespace dksl { /* * 归并 * numArray为整形数组 * head为要归并的数组的开始位置索引 * waist为要归并的数组的中间位置索引 * tail-1为要归并的数组的结束位置索引 */ void merge( int *numArray, const int head, const int waist, const int tail) { int begin=head,start=waist,index=0; int length=tail-head; int * temp= new int [length]; if (temp== nullptr ) throw "系统为程序分配内存失败" ; while (begin<waist&&start<tail) { if (numArray[begin]<numArray[start]) temp[index++]=numArray[begin++]; else temp[index++]=numArray[start++]; } if (begin==waist) { while (start<tail) temp[index++]=numArray[start++]; } else if (start==tail) { while (begin<waist) temp[index++]=numArray[begin++]; } //memcpy(numArray+head, temp, sizeof(int)*length); int i=0; for (i,index=head;i<length;i++,index++) { numArray[index]=temp[i]; } delete (temp); } void sort( int *numArray, const int head, const int tail) { int length = tail - head; int begin = head, middle = ((head+tail)%2 == 0) ? (head+tail)/2 : (head+tail+1)/2, end = tail; if (length < 2) return ; else if (length == 2) merge(numArray,begin,middle,end); else { if ( middle- begin > 1) sort(numArray,begin,middle); if ( end- middle > 1) sort(numArray,middle,end); merge(numArray,begin,middle,end); } } } |
c++动态数组分配很方便,“int* temp=new int[length]; ”length在程序运行过程中确定。为了养成良好的习惯,请在定义的指针空间使用完后,将其删除。
下面是本算法的测试代码MergeSort.cpp:
#include "stdafx.h" #include <iostream> #include "Merge.h" using namespace std; using namespace dksl; int _tmain( int argc, _TCHAR* argv[]) { int a[10] = {1, 4, 8, 5, 10, 25, 54, 15, 12, 2}; int i = 0; sort(a, 0, 10); cout<< "The sorted array is:" ; for (i = 0; i < 10; i++) cout<<a[i]<< " " ; cout<<endl; system ( "PAUSE" ); return 0; } |
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端