《算法导论》——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;
}
运行结果:

《算法导论》——MergeSort的更多相关文章
- 《算法导论》归并排序----merge-sort
伪代码请见<算法导论>2.3节 merge-sort实现: public class MergeSort { public static void sort(double [ ...
- 【算法导论C++代码】归并排序
一个归并排序卡了一天最后还是归并算法有问题,最初是为了把算法导论的伪代码转到c++而加了一些东西,其中在对左右数组的赋值那里出了问题.因为进行测试时不完全,就是只用书上的数组进行测试时,归并算法部分还 ...
- 《算法导论》第二章demo代码实现(Java版)
<算法导论>第二章demo代码实现(Java版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...
- 算法导论 - 基础知识 - 算法基础(插入排序&归并排序)
在<算法导论>一书中,插入排序作为一个例子是第一个出现在该书中的算法. 插入排序: 对于少量元素的排序,它是一个有效的算法. 插入排序的工作方式像许多人排序一手扑克牌.开始时,我们手中牌为 ...
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- 红黑树——算法导论(15)
1. 什么是红黑树 (1) 简介 上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...
- 基本数据结构(2)——算法导论(12)
1. 引言 这一篇博文主要介绍链表(linked list),指针和对象的实现,以及有根树的表示. 2. 链表(linked list) (1) 链表介绍 我们在上一篇中提过,栈与队 ...
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- quickSort算法导论版实现
本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...
随机推荐
- 手机开发者模型,上方显示p dx dy xv yv
prs:当前压强 (红色的时候 表示 压强趋向稳定或达到最大压强)p:触碰点状况p:(x/y) x为当前监控的触摸点 y为当次触摸屏幕操作最大触摸点个数 你可以理解为 y是有多少根手指放过在屏幕上 x ...
- Docker-compose ports和expose的区别
docker-compose中有两种方式可以暴露容器的端口:ports和expose. 1 ports ports暴露容器端口到主机的任意端口或指定端口,用法: ports: - "80:8 ...
- linux下串口调试工具
apt install cutecom 或者 serialtool 后者github上搜索
- 跟着未名学Office - 高效笔记OneNote
了解OneNote 2016年12月22日 19:57 OneNote Summary 理解OneNote中的笔记本.分区.页的概念 编写人:未名 感谢秦大: http://www.zloffi ...
- 安装使用git
阿斯蒂芬 http://www.cnblogs.com/alex3714/articles/5930846.html
- C++进阶--类的继承
//############################################################################ /* * 公有,保护,私有继承 */ cl ...
- 阿里云ECS安装Kubernetes问题收集与解答
问题1 kubernetes pod启动报错open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such fil ...
- C与C++的部分区别
1.函数无形参情况 void test() { } int main() { test(,); ; } 在C语言中形参括号没有参数时代表接受任意多的参数,而在C++语言中代表void(无参数) 所以上 ...
- Jmeter(二十)Beanshell or JSR223
有关Beanshell和JSR223组件的部分,早就想写一大篇幅随笔进行记录,苦于不知如何去描述这两部分的内容,一直在修改随笔. 介绍一下Beanshell: Beanshell是轻量级Java,支持 ...
- [UE4]显示队友