(8)交换排序之一 起泡排序
摘要:起泡排序(BubbleSort),依次比较相邻的两个记录的关键字,逆序时交换,一趟比较后最大的记录被安置到最后一个记录的位置上。时间复杂度为O(n^2)。void CExchangeSort::BubbleSort(void){ const int count = 9, length = count -1; int L[count] = {0, 49, 38, 65, 97, 76, 13, 27, 49}; bool change = true; for (int i = count - 1; i > 0 && change; -- i) { change = fals
阅读全文
posted @
2011-04-30 20:53
星晨_jqren
阅读(757)
推荐(0)
(7)插入排序之五 希尔排序
摘要:希尔排序(Shell’sSort)又称“缩小增量排序”(Diminishing Increment Sort),它也是一种属于插入排序类的方法,但在时间效率上较前述几种排序方法有较大的改进。时间复杂度为O(n^3/2)。理解:先将整个待排记录序列分割成为若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。void CInsertionSort::ShellSort(void){ const int count = 9, length = count -1; int L[count] = {0, 49, 38, 65, 97, 76, 13, .
阅读全文
posted @
2011-04-28 21:23
星晨_jqren
阅读(792)
推荐(1)
(6)插入排序之四 表插入排序
摘要:若希望在排序过程中不移动记录,只有改变存储结构,进行表插入排序。存储结构定义如下:#define SIZE 100 //静态链表容量typedef struct { string rc; //记录项 int next; //指针项}SLNode; //表结点类型typedef struct{ SLNode r[SIZE]; //0号单元为表头结点 int length; //链表当前长度}SLinkListType; //静态链表类型 为了方便插入,设数组中下标为“0”的分量为表头结点,并令表头结点记录的关键字取最大整数MAXINT。则表插入排序的过程描述如下:首先将静态链表中数组下标为“1.
阅读全文
posted @
2011-04-28 20:27
星晨_jqren
阅读(720)
推荐(0)
(5)插入排序之三 2-路插入排序
摘要:2-路插入排序是在折半插入排序的基础上再改进之,其目的是减少排序过程中移动记录的次数,但为此需要n个记录的辅助空间。时间复杂度为O(n^2)。理解:所谓的2-路,是指优先插入在序列前面或后面,然后再考虑插入到中间。void CInsertionSort::Path2Insertion(void){ //元素0是哨兵。 const int count = 9, length = count -1; int L[count] = {0, 49, 38, 65, 97, 76, 13, 27, 49}; //对顺序表L作2-路插入排序。 int d[length] = { 0 }; d[0] = .
阅读全文
posted @
2011-04-25 22:17
星晨_jqren
阅读(4399)
推荐(1)
(4)插入排序之二 折半插入排序
摘要:由于插入排序的基本操作是在一个有序表中进行查找和插入,这个“查找”操作可利用“折半查找”来实现,由此进行的插入排序称之为折半插入排序(Binary Insertion Sort)。时间复杂度为O(n^2)。理解:依次将每个待排序的记录插入到一个有序序列的合适位置。插入的位置是采用折半查找法确定的。void CInsertionSort::BinaryInsertion(void){ //元素0是哨兵。 const int count = 9; int L[count] = {0, 49, 38, 65, 97, 76, 13, 27, 49}; //对顺序表L作折半插入排序。 for (in.
阅读全文
posted @
2011-04-24 22:28
星晨_jqren
阅读(1354)
推荐(0)
(3)插入排序之一 直接插入排序
摘要:直接插入排序(StraightInsertion Sort)是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。时间复杂度为O(n^2)。理解:依次将每个待排序的记录插入到一个有序序列的合适位置。插入的位置是和有序序列的每一个元素进行比较,然后确定的。void CInsertionSort::StraightInsertion(void){ //元素0是哨兵。 const int count = 9; int L[count] = {0, 49, 38, 65, 97, 76, 13, 27, 49}; //对顺序表作直接插入排序。.
阅读全文
posted @
2011-04-23 20:40
星晨_jqren
阅读(836)
推荐(0)
(2)排序概述
摘要:P263 排序(Sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。 为了便于讨论,在此首先要对排序下一个确切的定义: 假设含n个记录的序列为:{ R1, R2, ... , Rn },其相应的关键字序列为:{ K1, K2, ... , Kn },需确定1, 2, ... , n的一种排列p1, p2, ... , pn,使其相应的关键字满足如下的非递减(或非递增)关系:Kp1 <= Kp2 <= ... <= Kpn,使序列成为一个按关键字有序的序列:{ Rp1, Rp2, ... , Rpn
阅读全文
posted @
2011-04-22 23:02
星晨_jqren
阅读(708)
推荐(0)
设计模式C++学习笔记之十九(State状态模式)
摘要:19.1.解释概念:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。main(),客户CLiftState,电梯状态抽象类CCloseingState,电梯门关闭COpenningState,电梯门打开CRunningState,电梯运行CStoppingState,电梯停止CContext,电梯的控制面板说明:CContext保持电梯的状态,并提供操作的接口函数。当函数被调用时,CContext直接调用当前状态的相应函数。由状态的接口函数来确定是否可以执行这个动作,以及修改状态为执行这个动作后的状态。看代码:第一块是不使用模式的做法,第二块是使用模式的做法,在main
阅读全文
posted @
2011-04-21 20:31
星晨_jqren
阅读(15568)
推荐(1)
设计模式C++学习笔记之十八(Visitor访问者模式)
摘要:18.1.解释概念:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。main(),客户IVisitor,访问者接口CBaseVisitor,访问者实现类CEmployee,被访问者抽象类CCommonEmployee,被访问者实现类之一CManager,被访问者实现类之二说明:A接受B的访问,B主动的执行访问动作。注意:和观察者的区别是,被观察者要执行一个动作,然后主动发送通知给观察者。访问者模式是由访问者主动发出的动作。看代码://IVisitor.h#pragma onceclass CCommonEmployee;class CM
阅读全文
posted @
2011-04-21 20:02
星晨_jqren
阅读(9928)
推荐(2)
设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)
摘要:17.1.解释概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。main(),客户IWomen,发出请求者接口CWomen,请求者实现类CHandler,处理请求抽象类CFather,处理请求实现类,责任链之一CHusband,处理请求实现类,责任链之二CSon,处理请求实现类,责任链之三说明:CHandler抽象类负责聚合责任链之中的其它处理对象,用SetNext来建立这个责任链。HandleMessage在处理请求时,会判断是否是自己要处理的请求,如果是则直接处理。如果不是,则查找下一个责任
阅读全文
posted @
2011-04-20 22:33
星晨_jqren
阅读(4903)
推荐(2)
设计模式C++学习笔记之十六(Observer观察者模式)
摘要:16.1.解释概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。main(),IObservable,被观察者接口CHanFeiZiObservable,被观察者韩非子IObserver,观察者接口CLiSiObserver,观察者李斯CZhouSiObserver观察者周斯说明:将观察者聚集到被观察者韩非子身边,韩非子的每一个举动都会通知给观察者,如李斯或周斯。注意:最多允许一个对象既是观察者也是被观察者。就像数据库中的触发器一样,成为一个复杂的链就很难维护了。观察者类似于委托的处理方式。//IObservable.h#pragma
阅读全文
posted @
2011-04-20 22:21
星晨_jqren
阅读(12494)
推荐(2)
设计模式C++学习笔记之十五(Composite组合模式)
摘要:15.1.解释概念:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合的使用具有一致性。main(),客户CCorpNode,抽象基类,实现基本信息CBranchNode,树枝节点,实现Addordinate()函数和GetSubordinate()函数CLeafNode,叶子节点,IsLeaf属性总是“true”说明:组合模式主要是实现在CBranchNode对象里增加对其它对象的数组,如vector<CCorpNode*>,数组里可以存放CBranchNode和CLeafNode对象。这样方便进行遍历操作。注意:组合模式有透明组合模式
阅读全文
posted @
2011-04-19 22:34
星晨_jqren
阅读(4961)
推荐(1)
设计模式C++学习笔记之十四(Iterator迭代器模式)
摘要:14.1.解释概念:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。main(),客户IProject,产品接口CProject,产品类IIterator,迭代器接口IProjectIterator,产品迭代器接口CProjectIterator,产品迭代器实现类说明:CProject实现产品类,能够返回一个迭代器的指针。这个迭代器将封装产品类里的一个数组。所以迭代器在运行Next函数时,可以遍历这个数组的所有元素。简单来说,就是用代码实现vector<int>::iterator或vector<int>::const_iterator。我们来
阅读全文
posted @
2011-04-19 21:53
星晨_jqren
阅读(7318)
推荐(1)
设计模式C++学习笔记之十三(Decorator装饰模式)
摘要:装饰模式,动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。13.1.解释main(),老爸ISchoolReport,成绩单接口CFourthGradeSchoolReport,四年级成绩单ReportDecorator,成绩单装饰器基类HighScoreDecorator,最高分装饰器SortDecorator,班级排名装饰器说明:对“四年级成绩单”进行装饰,ReportDecorator必然有一个private变量指向ISchoolReport。注意:看代码:// Decorator.cpp//主程序#include "stdafx
阅读全文
posted @
2011-04-18 21:57
星晨_jqren
阅读(5251)
推荐(2)
设计模式C++学习笔记之十二(Command命令模式)
摘要:命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。应该是一个比较简单的模式了。12.1.解释main(),客户CInvoker,命令接收者,如项目经理IGroup,执行者接口CRequirementGroup,实际执行者之一CPageGroup,实际执行者之二CCodePage,实际执行者之三ICommand,命令接口CAddRequirementCommand,Execute函数,将调用CRequirementGroup的多个命令。来组合执行用户发出的命令。CDeletePageCommand,同上... ... 其它
阅读全文
posted @
2011-04-18 21:38
星晨_jqren
阅读(6172)
推荐(0)
设计模式C++学习笔记之十一(Bridge桥梁模式)
摘要:桥梁模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。实现分离的办法就是增加一个类,11.1.解释main(),客户IProduct,产品接口CHouse,房子CIPod,ipodCClothes,服装CNewCorp,桥梁类,MakeMoney()是桥梁方法CNewHouseCorp,只能生产房子,所以构造函数是CHouse*CShanZhaiCorp,什么赚钱就生产什么,所以构造函数是IProduct*说明:客户直接使用CNewHouseCorp和CShanZhaiCorp类,在main()函数里构造产品,然后传到这两个类里。这两个类的MakeMoney()函数,先调用基类的Ma
阅读全文
posted @
2011-04-17 19:55
星晨_jqren
阅读(6746)
推荐(3)
(1)算法效率的度量
摘要:算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。而度量一个程序的执行时间通常有两种方法。(1)事后统计的方法。(2)事前分析估算的方法。因事后统计方法更多的依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用事前分析估算的方法。两个N * N矩阵相乘。如 2 * 2的矩阵,void CMatrixNN::ComputeN2(void){ const int n = 2; int a[n][n] = { {1, 2}, {1, 2} }; int b[n][n] = { {1, 2}, {1, 2} }; int result2[][n] .
阅读全文
posted @
2011-04-17 18:11
星晨_jqren
阅读(4096)
推荐(0)
使用火狐浏览器的原因是什么?使用英文版火狐的原因又是什么?
摘要:1.安全,这是我最开始使用火狐浏览器原因,因为有很多网站的恶意代码都是针对IE内核浏览器的。当然相对而言TT、Maxthon、360会比IE安全一些,但仍然不是百分之百的安全。2.插件,这是我后来使用火狐的第二个原因,第一个原因让我用了很长时间。直到每天上班都不想带着笔记本了,但用习惯了火狐的操作方式,希望在公司的电脑上也是一样的习惯,特别是收藏夹。在火狐上必装的插件有两个Tab Mix和GBookmarks,前者保持了浏览器使用上的一致,后者保证了收藏在Internet上,无论在哪里,不用带着笔记本都可以随时使用,重安装系统时也不用备份了。3.兼容,随着时间的推移,越来越多的网站在开发时,需
阅读全文
posted @
2011-04-17 11:04
星晨_jqren
阅读(1452)
推荐(0)
使用GTest进行C++模块的单元测试。
摘要:说起单元测试,是代码重构,和开发一款稳定、高可维护性的软件所必需的部分。现在有好多单元测试的工具,可以用在不同的环境和不同的语言,如JUnit,NUnit,Boost_Test,这里简单介绍一下Google的Test工具,GTest。在gtest.h的末尾(#endif之前)添加如下语句://我自己添加的#ifdef _DEBUG#pragma comment(lib,"gtestd.lib")#else#pragma comment(lib,"gtest.lib") #endif//启动所有测试int main(int argc, char **arg
阅读全文
posted @
2011-04-16 10:16
星晨_jqren
阅读(1819)
推荐(0)
设计模式C++学习笔记之十(Builder建造者模式)
摘要:建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。一段晦涩难懂的文字,实现创建不同表示的方法就是给创建的过程传入创建的参数。详细的还是看代码吧。10.1.解释main(),客户CCarModel,产品模型CBenzModel,奔驰模型CBMWModel,宝马模型ICarBuilder,建造者接口CBenzBuilder,奔驰建造者CBMWBuilder,宝马建造者CDirector,导演说明:CCarModel实现模板方法,Builder负责开始建造产品。建造产品时,构建的顺序由Director或main决定。注意:建造者模式和抽象工厂非常类似。建造者更重视
阅读全文
posted @
2011-04-15 23:05
星晨_jqren
阅读(7976)
推荐(1)
设计模式C++学习笔记之九(Template Method模板方法模式)
摘要:模板模式也是相当简单的一种模式,而且是比较常用的。模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。cbf4life举的例子是悍马车模型,更详细的例子说明可以参考原作者博客:cbf4life.cnblogs.com。这里只提出C++的设计和实现方法,以方便随用随取。9.1.解释main(),客户CHummerModel,悍马模型CHummerH1Model,悍马模型型号1CHummerH2Model,悍马模型型号2说明:在CHummerModel声明Start、Engineboom、Ala
阅读全文
posted @
2011-04-15 00:25
星晨_jqren
阅读(5807)
推荐(2)
设计模式C++学习笔记之八(Adapter适配器模式)
摘要:适配器模式,使用之处比较特殊,不属于常规设计模式,主要用于不同系统之间的处理。是将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。也是一个比较简单的模式,直接上代码了。看代码:8.1.解释main(),主程序IUserInfo,本系统内接口CUserInfo,本系统内实现类IOuterUser,外系统接口COuterUser,外系统实现类COuterUserInfo,本系统内适配类说明:COuterUserInfo实现IUserInfo接口,将外部系统实现类COuterUser转换成本系统内的接口IUserInfo。使用外部
阅读全文
posted @
2011-04-13 21:51
星晨_jqren
阅读(7717)
推荐(3)
设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
摘要:抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合。看代码:7.1.解释main(),女娲IHuman,产品接口CYellowHuman,抽象产品之一CYellowFemaleHuman,具体产品之一CYellowMaleHuman,具体产品之二CWhiteHuman,抽象产品之二CWhiteFemaleHuman,具体产品之三CWhiteMaleHuman,具体产品之四CBlackHuman,抽象产品之三CBlackFemaleHuman,具体产品之五CBlackMaleHuman,具体产品
阅读全文
posted @
2011-04-13 21:10
星晨_jqren
阅读(9500)
推荐(3)
设计模式C++学习笔记之六(Facade门面模式)
摘要:Facade门面模式,也是比较常用的一种模式,基本上所有软件系统中都会用到。 GOF 在《设计模式》一书中给出如下定义:为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简单说,就是将复杂的逻辑封装起来,对外公开简单的接口,由客户程序调用。这里举了一个发送邮件的例子,我们理解为电子邮件吧,普通的邮件应该不需要告诉邮局,我们写的信件内容(呵呵有点较真了)。这个例子更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。9.1.解释main(),客户ILetterProcess,接口CLetterProces
阅读全文
posted @
2011-04-12 22:23
星晨_jqren
阅读(8789)
推荐(3)
设计模式C++学习笔记之五(Factory Method工厂方法模式)
摘要:工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。这个例子更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。贴代码了。5.1.解释main(),女娲IHuman,产品接口CYellowHuman,产品之一CWhiteHuman,产品之二CBlackHuman,产品之三IHumanFactory,工厂接口CYellowHumanFactory,工厂之
阅读全文
posted @
2011-04-11 22:37
星晨_jqren
阅读(14400)
推荐(4)
设计模式C++学习笔记之四(Multition多例模式)
摘要:多例模式,这个在GOF的模式设计里没有提到,但在实际工作中确实会用到。更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。4.1.解释main(),客户略说明:和单例基本一样,是有个数限制的单例。如果对于产生的实例个数没有限制,那就不是多例了,和普通的类没有区别。举例:曾经开发过一个从服务端以UDP协议,发送文件到客户端的程序。客户端连接服务端时采用TCP协议,服务端接受连接,产生一个向客户端传输文件的实例FileService。每个客户端的连接都会产生一个实例,但同一客户端的多个连接请求会共享一个FileService实例。理论上讲FileService实例的个数
阅读全文
posted @
2011-04-11 00:13
星晨_jqren
阅读(9422)
推荐(1)
设计模式C++学习笔记之三(Singleton单例模式)
摘要:单例模式看起来也蛮简单的,就是在系统中只允许产生这个类的一个实例,既然这么简单,就直接贴代码了。更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。3.1.解释main(),大臣CEmperor,需要单例的类说明:很多大臣拜见的皇帝,只有一个。体现在面向对象方面,CEmperor定义一个静态指针,和一个静态函数,私有化构造函数、析构函数、构造函数复制、重载赋值语句。注意:线程安全,采用互斥体的方式实现。看代码://Emperor.h#pragma once#include <iostream>using std::cout;using std::endl
阅读全文
posted @
2011-04-09 22:30
星晨_jqren
阅读(18096)
推荐(5)
写一个面向对象的函数库BaseCommon,这是一个Win32的DLL
摘要:顺便测试一下Windows Live Writer.貌似很好用的样子。//BaseCommon.h#pragma once#include <iostream>#ifdef BASECOMMON_EXPORTS#define BASECOMMON_API __declspec(dllexport)#else#define BASECOMMON_API __declspec(dllimport)#endifnamespace safee{ class BASECOMMON_API CConvert { public: CConvert(void); ~CConvert(void);
阅读全文
posted @
2011-04-08 23:38
星晨_jqren
阅读(1973)
推荐(0)
设计模式C++学习笔记之二(Proxy代理模式)
摘要:代理,一看名字就知道这只是个中介而已,真实的执行者在代理的后面呢。cbf4life在他的书里提的例子也很有趣,更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。现在贴代码,以方便随用随取。2.1.解释main(),西门庆IKindWomen,接口CWangPo,代理CPanJinLian,实际执行者之一CJiaShi,实际执行者之二说明:代理和实际执行者派生于共同的接口,代理拥有实际执行者的实例。代理的每一个函数(接口的实现函数),直接调用实际执行者的对应接口函数。注意:代理只是简单的装载,然后调用实际执行者的函数。看代码://IKindWomen.h#pragm
阅读全文
posted @
2011-04-08 22:42
星晨_jqren
阅读(21109)
推荐(7)
设计模式C++学习笔记之一(Strategy策略模式)
摘要:无意中,从网上下到一本电子书《24种设计模式介绍与6大设计原则》,很好奇这里有24种设计模式,印象中GOF写的《设计模式》(Design Patterns),好像只有23种吧。运行起来一看,还真挺吸引咱的,里面提到的例子都很有趣。很感谢作者写出这样好的例子来,我的目的是把作者提到的例子用C++来实现。写这本书的作者是:cbf4life,更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。这里只进行简单提示和实现编码。1.1.解释main(),赵云CContext,锦囊IStrategy,策略接口CBackDoor,策略之一CGivenGreenLight,策略之二C
阅读全文
posted @
2011-04-07 22:59
星晨_jqren
阅读(38362)
推荐(14)