前言:

  在今后的日子里,我将持续更新博客,讨论《算法导论》一书中的提到的各算法的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;
}

  运行结果:

《算法导论》——MergeSort的更多相关文章

  1. 《算法导论》归并排序----merge-sort

    伪代码请见<算法导论>2.3节 merge-sort实现: public class MergeSort {        public static void sort(double [ ...

  2. 【算法导论C++代码】归并排序

    一个归并排序卡了一天最后还是归并算法有问题,最初是为了把算法导论的伪代码转到c++而加了一些东西,其中在对左右数组的赋值那里出了问题.因为进行测试时不完全,就是只用书上的数组进行测试时,归并算法部分还 ...

  3. 《算法导论》第二章demo代码实现(Java版)

    <算法导论>第二章demo代码实现(Java版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...

  4. 算法导论 - 基础知识 - 算法基础(插入排序&归并排序)

    在<算法导论>一书中,插入排序作为一个例子是第一个出现在该书中的算法. 插入排序: 对于少量元素的排序,它是一个有效的算法. 插入排序的工作方式像许多人排序一手扑克牌.开始时,我们手中牌为 ...

  5. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  6. 红黑树——算法导论(15)

    1. 什么是红黑树 (1) 简介     上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...

  7. 基本数据结构(2)——算法导论(12)

    1. 引言     这一篇博文主要介绍链表(linked list),指针和对象的实现,以及有根树的表示. 2. 链表(linked list) (1) 链表介绍      我们在上一篇中提过,栈与队 ...

  8. 堆排序与优先队列——算法导论(7)

    1. 预备知识 (1) 基本概念     如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...

  9. quickSort算法导论版实现

    本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...

随机推荐

  1. NDK学习笔记(五)Reader机制

    针对每一种后缀名Nuke都提供了对应的模块.为了决定用哪个版本的reader或writer模块,Nuke会先解析文件后缀名再以此为依据调用相关模块. 以JPG为例: 该文件格式有两种后缀名:.jpg和 ...

  2. Python高效编程技巧

    如何在列表,字典,集合中根据条件筛选数据 1.过滤掉列表[-1,-2,-3,4,5,6]中的负数和0 方法1,for循环 data = [-1, -2, -3, 4, 5, 6] res = [] f ...

  3. ubuntu-docker入门到放弃(二)docker初探(基本用法及命令)

    一.使用公共镜像 docker有一个开源的镜像管理系统,上面有很多常见的images,如mysql,nginx,tomcat等,可以直接根据自己的需求下载下来用,还有系统images,如redhat, ...

  4. tomcat源码 StandardService

    在执行StandardServer的initInternal的时候会执行StandardService#init,然后会调到initInternal protected void startInter ...

  5. 我的ehcache笔记

    我的EhcacheUtils类: package com.shinho.bi.utils; import org.ehcache.CacheManager; import org.ehcache.co ...

  6. django获取表单数据

    django获取单表数据的三种方式 v1 = models.Business.objects.all() # v1是QuerySet的列表 ,内部元素都是对象 v2 = models.Business ...

  7. bzoj4940: [Ynoi2016]这是我自己的发明

    用dfs序把询问表示成询问dfs序的两个区间中的信息 拆成至多9个询问(询问dfs序的两个前缀),对这些询问用莫队处理,时间复杂度$O(n\sqrt{m})$ #include<bits/std ...

  8. openssl命令实例

    基本知识 1,证书标准 X.509 X.509 - 这是一种证书标准,主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准. X.509的证书文件,一般以.cr ...

  9. MaidSafe区块链项目白皮书解读

    MaidSafe.net宣布项目SAFE到社区 1. 介绍 现有的互联网基础设施越来越难以应付超过24亿互联网用户的需求,这个数字在2017年预计将增长到36亿.今天的架构中,中央中介(服务器)存储并 ...

  10. [UE4]关于分支Sequence和条件分支的组合用法

    当需要不管条件语句是否成立的后面都需要执行的语句,可以使用“Sequence”来分支,达到简化蓝图连线的目的.如下图所示: