《算法导论》——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;
}

   运行结果:

posted @   Scott Lewis  阅读(366)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示