用C++写并列数据编号后排序,就是从1-10排序那种

07:54:13 UTC
JS不是更简单吗???新手求教
10:50:22 UTC
运行效率问题吧.不然现在火的依然是AS而不是cocos和u3d了.
12:25:31 UTC
AS是指actionscript吗?
flash的时候学过,感觉比C++简单多了啊
02:46:12 UTC
我也不知道,我是因为不会JS……
07:05:59 UTC
是的,就是配合Flash用的脚本语言.简单肯定简单很多,本身页游方面也是处于垄断地位,但是到了手游时代,因为各种性能原因没挺住,所以cocos和u3d取而代之.
07:58:25 UTC
其实是用LUA的多。。。一般公司开发都是C++底层通讯,游戏逻辑LUA实现。。。其实我也是招聘网上看来的信息,要JS的没几家。。。。
08:30:03 UTC
用lua的是最多的,做上线项目的话~~~
13:31:49 UTC
然而cocos2dx并不能做html5。。。js可以。。
06:27:04 UTC
cocos有js版本
07:38:07 UTC
因为大多数大谈效率,内存,优化,都是装b的逗比,感觉c++叼,高大上!!!
08:21:30 UTC
也不是装b吧,之前用AS作一个3D手游.效果差不多就是乱斗西游这样子,比乱斗西游还早.最后死掉了.很大一部分原因就是运行效率太差了.客户端各种卡顿,公司高层宣布下个项目直接换引擎了.
08:59:50 UTC
as是效率真差~但是这里指的js不是H5的js,只是作为C++绑定到js的接口,所以根本不存在效率问题,所有的帧和渲染都是跑在C++里的,js只是写点逻辑,所以要有效率问题,也是逻辑有问题,跟语言没啥关系。
10:29:25 UTC
可是为什么大部分都用c++开发呢
03:40:23 UTC
我以为他说的H5的.不过虽然逻辑上面基本上效率可以忽略那些差距了,但是我见过的项目核心的战斗和粒子特效这些还是用C++解决的多.
03:43:52 UTC
现在大部分开发不用C++吧,都是C++只负责核心和底层部分,大部分逻辑还是用Lua这些多点.有些要求低一点的项目直接用的cocos提供的C++部分,或者自己扩展的C++代码也少.要求高一点的项目,像实时战斗的RPG这些,会让大神写一些核心的C++代码.
09:01:07 UTC
说一下论坛中经常提到的核心战斗,我不知掉指的是什么,现在基本上所有的上线游戏,战斗都会脚本写的,脚本大多数用的lua。根本不知道核心战斗用C++写是哪里得出来的???C++一般只在,游戏中的的特效处理,表格数据的处理,网络数据的处理,等这些地方使用。就是大量可以重用的部分,大量循环的部分。战斗是属于常改变的东西,怎么可能用C++写,都是搞笑的吗???策划一句话,全部重写吗?喂?
11:00:31 UTC
战斗怎么是常改变的东西呢?就拿刀塔传奇举例,他的战斗模式肯定是基本不变的,变化的只是传递进去的参数罢了.我上一个项目的效果大概就是乱斗西游那种rpg战斗,战斗结果肯定是要求实时展现的,一个技能下去,设计技能的数值,角色的属性,身上的bf&debf,目标的属性bf%debf,双方的有限状态机,技能动画和粒子等展现.中间还有一大堆的状态判定什么的,真的用脚本不能保证效率.
当然,如果是卡牌和回合制这种战斗,也许脚本就能胜任了.
03:50:41 UTC
但是刀塔传奇的战斗就是lua写的,毫无疑问,类dota类游戏计算量高吧?还是用的lua脚本,举个例子,对于刀塔传奇,多一个英雄难道要更新整个客户端??新加英雄能用传参数做到??新英雄连技能是什么都不知道,能预知未来??
07:09:55 UTC
新加英雄一般情况下当然不需要更新整包.因为本身更新的这个英雄实际上是一顿数据.包括这个英雄的技能什么的也是一堆数据.但是战斗核心这块基本是不变的,除非重大的版本更新.
新英雄的技能虽然不能预知,但是这些技能肯定也是符合直接设定好的规则的.
就像你经常提的编译器什么的,时间上技能大多数都是策划通过编译器编的,而这个编译器能够编的技能类型都是对应之前已经做好的战斗模块.
还有我上面说了,卡牌之类简单的战斗确实没有规定一定需要C++写,主要还是看你游戏的复杂程度.
02:49:46 UTC
重要的事情说三遍~~
新英雄的技能虽然不能预知,但是这些技能肯定也是符合直接设定好的规则的.新英雄的技能虽然不能预知,但是这些技能肯定也是符合直接设定好的规则的.新英雄的技能虽然不能预知,但是这些技能肯定也是符合直接设定好的规则的.
哈哈哈,这个事情真能做到,程序员真的可以幸福一辈子~让策划都去吃屎吧~可惜然并卵~今生是实现不了了C++应用汉字排序(按照拼音排序) - C++当前位置:& &&&C++应用汉字排序(按照拼音排序)C++应用汉字排序(按照拼音排序)www.MyException.Cn&&网友分享于:&&浏览:210次C++使用汉字排序(按照拼音排序)#include &stdafx.h&
void&& FirstLetter(int&& nCode,&& char&&& strRet);&&
void&& GetFirstLetter(char*&& strName,&& char*&& strFirstLetter,int nLen)&&
unsigned char&& ucHigh,&& ucL&&
int&&&& nC&&
char&& strR&&
memset(strFirstLetter,&& 0,&& sizeof(nLen));&&
int&& len&& =&& 0;&&
for&& (i=0;&& i&& &&& (int)strlen(strName);&& i++)&&
&&if&& ((unsigned char)strName&& &&& 0x80)&&
&&ucHigh&& =&& (unsigned char)strName;&&
&&ucLow&&&& =&& (unsigned char)strName;&&
&&if&& (&& ucHigh&& &&& 0xa1&& ||&& ucLow&& &&& 0xa1)&&
&& //&& Treat&& code&& by&& section-position&& as&& an&& int&& type&& parameter,&&
&& //&& so&& make&& following&& change&& to&& nCode.&&
&& nCode&& =&& (ucHigh&& -&& 0xa0)&& *&& 100&& +&& ucLow&& -&& 0xa0;&&
&&FirstLetter(nCode,&& strRet);&&
&&strFirstLetter[len]&& =&& strR&&
&&i++;&&
&&len++;&&
strFirstLetter[len]&& =&& 0;&&
void&& FirstLetter(int&& nCode,&& char&&& strLetter)&&
if(nCode&& &=&& 1601&& &&&& nCode&& &&& 1637)&& strLetter&& =&& 'A';&&
if(nCode&& &=&& 1637&& &&&& nCode&& &&& 1833)&& strLetter&& =&& 'B';&&
if(nCode&& &=&& 1833&& &&&& nCode&& &&& 2078)&& strLetter&& =&& 'C';&&
if(nCode&& &=&& 2078&& &&&& nCode&& &&& 2274)&& strLetter&& =&& 'D';&&
if(nCode&& &=&& 2274&& &&&& nCode&& &&& 2302)&& strLetter&& =&& 'E';&&
if(nCode&& &=&& 2302&& &&&& nCode&& &&& 2433)&& strLetter&& =&& 'F';&&
if(nCode&& &=&& 2433&& &&&& nCode&& &&& 2594)&& strLetter&& =&& 'G';&&
if(nCode&& &=&& 2594&& &&&& nCode&& &&& 2787)&& strLetter&& =&& 'H';&&
if(nCode&& &=&& 2787&& &&&& nCode&& &&& 3106)&& strLetter&& =&& 'J';&&
if(nCode&& &=&& 3106&& &&&& nCode&& &&& 3212)&& strLetter&& =&& 'K';&&
if(nCode&& &=&& 3212&& &&&& nCode&& &&& 3472)&& strLetter&& =&& 'L';&&
if(nCode&& &=&& 3472&& &&&& nCode&& &&& 3635)&& strLetter&& =&& 'M';&&
if(nCode&& &=&& 3635&& &&&& nCode&& &&& 3722)&& strLetter&& =&& 'N';&&
if(nCode&& &=&& 3722&& &&&& nCode&& &&& 3730)&& strLetter&& =&& 'O';&&
if(nCode&& &=&& 3730&& &&&& nCode&& &&& 3858)&& strLetter&& =&& 'P';&&
if(nCode&& &=&& 3858&& &&&& nCode&& &&& 4027)&& strLetter&& =&& 'Q';&&
if(nCode&& &=&& 4027&& &&&& nCode&& &&& 4086)&& strLetter&& =&& 'R';&&
if(nCode&& &=&& 4086&& &&&& nCode&& &&& 4390)&& strLetter&& =&& 'S';&&
if(nCode&& &=&& 4390&& &&&& nCode&& &&& 4558)&& strLetter&& =&& 'T';&&
if(nCode&& &=&& 4558&& &&&& nCode&& &&& 4684)&& strLetter&& =&& 'W';&&
if(nCode&& &=&& 4684&& &&&& nCode&& &&& 4925)&& strLetter&& =&& 'X';&&
if(nCode&& &=&& 4925&& &&&& nCode&& &&& 5249)&& strLetter&& =&& 'Y';&&
if(nCode&& &=&& 5249&& &&&& nCode&& &&& 5590)&& strLetter&& =&& 'Z';&&
int _tmain(int argc, _TCHAR* argv[])
char pTemp[] = &今天很开心&;
char pTemp1[10];//保存汉字的首字母
GetFirstLetter(pTemp,pTemp1,10);
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有写过十年代码是种怎样的体验? - 知乎<strong class="NumberBoard-itemValue" title="被浏览<strong class="NumberBoard-itemValue" title="4,276分享邀请回答bbs.mit.edu。他设计了整个Webmail系统的架构。说到架构,可以提一下,不感兴趣的可以跳过这一段。FreeBSD系统,前端用C写FastCGI + Apache, 后端用C写RPC server, 存储用文件系统。 选择FreeBSD因为当时Linux的性能还不太强, 选择C开发,因为性能好, 省服务器就是省钱。 用C开发Web Mail, 现在看来是不是难以相信? 在当时的硬件性能可不比现在, 价格还高的很。 所以当时就面对一个很难的问题:C语言很容易内存搞错而崩溃, 而且FastCGI会要求服务进程一直保持运行, 这对代码的可靠性和稳定性要求都很高,因为一旦出错, 整个服务就会挂掉。他当时向我们极力推荐Emacs,我现在少数的Emacs知识就是他教的。 可惜我看到他输入Emacs命令时鸡爪状的手,决定还是坚持vim阵营。还有一个我印象最深的,这个和写代码无关。 他特别喜欢在大家吃饭的时候讲恶心笑话,以至于一段时间内,我都学坏了, 到处讲恶心笑话。 感兴趣的话,可以百度下“咬不断 笑话”,就知道他讲的多恶心了。还在上课的时候, 我们就每天中午下课后,在团委活动室集合,叫上西南村的外卖,一定要点一份“锅塌里脊”, 一边吃饭,一边讨论开发的细节, 下午没有课的话,就一下午都在写代码。因为写代码, 我逃了几次政治课,很不幸被点名了, 成为了我大学期间唯一一门挂了的课。放寒假的时候,4个小伙伴都没有回家,就10点多起来,直接打车到公司, 写代码写到晚上12点。打车回学校睡觉。至今我可以徒手敲telnet命令到smtp服务器或者pop3服务器,发送和接收邮件, 邮件协议记得太深了。我还记的我当时藏了一个彩蛋在代码中,邮件中搜索某些特殊字符,就会出现员工名单。后来被新来的一个哥们给移除了。就这样,4个大三的学生加上一个大四的师兄, 半年内服务上线, 4台服务器支持用户30w。回想起来,那时的我们虽然还是学生,算是实习生, 但做的事情完全和现在创业做的是一样的,甚至更加纯粹, 觉得在做有趣的事情就够了, 钱多钱少的没关系,更没有想过什么股票期权。这个公司后来怎么样了? 2000年的时候,互联网泡沫破碎了。这家公司很快转型, 做企业和校园邮件服务。我最近惊奇的发现,这家公司还存在呢。* 日晚更新 *## 黑客和假钞的故事 ##大四第二学期, 那时刚刚考完研,一个和我很熟的老师找到我,让我帮他做个东西。 先说说这个老师, 这个老师在我心中就是那种真正的黑客, 记得大一刚刚买来Modem,几个人都搞不定拨号上网, 我们找来这个老师帮我们看看, 只见他在键盘上运指如飞,啪啪啪啪几下, Windows超级终端中快速闪过一些文字之后, 他已经已经连上了学校BBS,看了下十大热门, 检查了几封邮件,回复其中一封,最后退出了,并断开了连接。和我们说道, “你们的猫没有问题”。
这一切大概花了1分钟, 其间没碰过一下鼠标。 其实当时我并没有 看明白他在干什么, 这只是事后我有了经验之后才理解到的。 那时这个老师长长的头发,不修边幅的样子, 就更符合心目中黑客的形象。 后来我们上了他讲的课, 讲的是数学软件Mathematica, 他讲的并不好,很多同学表示听不明白。 但我能看出来,他懂得很多, 只是不能讲出来,或者不屑讲出来。 有一次他给大家留上机作业题, 我当时用了一个很特别的思路,很快做出那道题,给他留下了印象。时间回到大四第二学期, 我去他在校外的一个办公室找到他, 他换了个人似的, 穿着西服皮鞋, 头发也柔顺飘柔起来。 老师和我寒暄了几句之后,就从抽屉中拿出两叠百元大钞, 我眼睛一亮。结果老师对我说:
“这钱不是给你花的, 是测试用的。我要请你做的是伪钞识别算法设计。 这个算法会用到自动售货机中的。 这里还有一个传感器,可以扫描钞票得到两个信号:一个是光信号, 一个是磁信号。你要通过这两组数字信号判断这个钞票是真钞还是假钞。”
“左边这一叠是真钞,你拿去花了也无妨。 右边这一叠可千万不能花掉或者丢掉!这个是多少钱都买不来的假钞, 公安局已经登记过了,一定要还回来。 ”这个问题非常有趣, 我很容易找到了班上的另外一个数学大牛帮忙。 后面的两个星期里,我们把学到的各种算法都用上了,什么神经网络、随机过程、遗传算法。可惜后来我因为个人的原因要去北京,没法继续研究了, 留下我的同学孤军奋战。 他在两个月后给出了一个相对不错的解决方案。 不过不清楚最后有没有应用到自动售货机上。## TCP/IP ##讲过笑话吧, 大学快毕业前,开始找工作了。 一个同学去面试,人家问他, “TCP/IP知道吗?”。 这个同学答道:“TC用过, PIP没用过”。&待续&3.8K527 条评论分享收藏感谢收起ed.com程序):后来,我开始迷上了QBASIC,它可以画图,这是我感兴趣的原因。另一个不经意的时间,画法几何老师办了一期AutoCAD与C语言辅导班,抱着对C语言的神往,我报名了,并从此不可收拾的喜欢上了C。兴趣是最大的老师,我要是一头骡子,前面挂着胡萝卜,就算背负着再重的货物,我也愿意一往无前。C语言真的是太棒了,可以检测到press any key,还可以settextcolor,甚至还可以initgraph哦~~~我对交互型的东西比较感兴趣,一开始模仿各种书籍上的代码,尝试着实现文本编辑器的一些功能(菜单、编辑、存取、光标),再后来直接跪拜在图形编程,熟悉了鼠标编程、中文编程、定时器编程。能体会到在DOS的窗口里出现鼠标箭头光标的欣喜么??能体会到在DOS的窗口里出现大中华的汉字的欣喜么??能体会到在DOS的窗口里拖曳十字架画图的欣喜么(没错!模仿的AutoCAD,因为我是机械专业嘛)??那个时候,我已经是系计算机编程大赛的一名积极分子,有一次获准用系办公室的一台386(用来打印的)调试程序,当天晚上我直接拉上同学Y,一起编程弄了个通宵。。。1997年接触到面向对象编程,当时给自己定了一个任务,就是把原来实现的那一堆GUI组件,封装成自己的Window、Text、Menu。。。也因此熟悉了OOP和Borland C++:1997年那个暑假应该是我连续上机时间最长的时候,这都归功于Y同学买了一台486的电脑,当时Y同学和C同学一起在学校外面租了个房子(我没出去住哦!!我只是因为和Y关系很铁,所以经常去用他的电脑)。然后大家轮流用电脑,Y用电脑看片,接下来我编程,然后是C同学用电脑玩游戏。注意这个顺序“Y同学——我——C同学”,由于C同学经常排在我后面,所以从不热爱学习的他后来都熟悉了Borland C++的修改状态的标志(好像是个类似于*的符号),一旦那个标志消失了,他就觉得我已经保存了,可以轮到他玩游戏了。。。值得一提的是,我写的那一坨GUI代码,后来委托开电脑房的Y同学给我打印出来了,留着自己欣赏。Y同学当时特意给那一坨加了一页封面,打上了一行标题:FakeWindows!至于被模仿的对象,那自然是DOS下的Windows 3.1了:1998年学习了微机原理,写了一些汇编,现在都忘光了~~~然后毕业设计用到了foxpro,然后外调我的C程序:1999年,已经上了研究生,开始用上了vc5.0,后来一直用vc以及mfc很多年:2000 开始接触web编程,开始是写html,后来关注一些动态的技术,除了vbscript和flash,后来我发现了asp以及interdev。为了快速掌握asp,我为自己又定了一个任务,为大学班级做了一个同学录,甚至还做了一个聊天室。那时候有很多免费的服务器空间,但是也不稳定,好好的没准哪天就不提供服务了。后来我直接将同学通讯录放在大学母校的服务器上,一直放了好多年~~~2001年参加工作,开始接触到java和jsp,那个时候没有成形的MVC框架,所以很多类似框架的东东都是自己撸:那个时候javascript控件很少,一般自己撸个树形控件,就很开心了,然后各个项目里都抢着用,满足感倍增!刚参加工作的那几年确实很开心,没事就逛逛水木BBS、一塌糊涂、CSDN。在水木上也找到一些好码友和mm ^_^期间帮好友们做过同乡会网站、蛋糕网站、电子元器件网站、采编发网站,ASP/JSP哪个顺手用哪个!2002年女朋友毕业了,我正式结束了一个人撸代码的时代,每个周末年轻的我们总是流窜在各大购物商场和小商品市场。。。GF负责挑东西买东西,我负责提包陪逛,那个时候的我,我常常说是“行尸走肉”,因为我脑子里经常在想着那堆代码、那些网页、新的idea。。。等晚上一回到我们的那个温馨小家,我马上继续将白天脑子里面的东西序列化成代码。。。2005年左右,发现java也有IDE了!!!中间的5年,以做项目为主。基本是Java Web包打天下,自己撸过MVC、DBCP、ORM以及RPC框架,但都不怎么深入,让小伙伴们顺利用上、少投诉就OK了。后来知道了Spring、jQuery、apache等开源项目,就基本上把那堆轮子扔掉了。。。2014年搞spark转道scala:我想申明的是,我是一个感性的程序员,因此总是难免有点念旧,经常想起DOS时代的:杀毒我们用KV:更多的是这个:依稀记得UCDOS:老求的WPS(我不会告诉你我知道万能密码是^QIUBOJUN)当然还有《仙剑》:C&C:同志们,我想告诉你们,最初我是在电视机上接着操纵杆玩的,你们信么?真的是哦~~~~以及98年左右的OICQ:嗨!看帖的那位,说你呢!见到上古时期就着粗像素看H照片的前辈,咋能不点赞呢?!++++++++++++++++++++++++++++++++++++++++++++Y同学受邀看到我前面写的,说我就知道讲故事,没提这十几年来是个什么体验。那好吧,我表达一下近二十年编程经历之后的体验,各位看官记得鼓掌(点赞):其一呢,现在总感觉某种编程语言没那么重要了,把功能实现了更重要;编程也没那么重要了,事情做成了更重要。很多小白总是吵着哪门语言好,这个确实很奶义务~~~要改!拿起YACC、Antlr,咱自己发明一门语言好不好?再不济,咱们写个XML编码的语言好不好?总之,感觉兴奋多了,一切就那么回事了~~第二呢,觉得编程本身确确实实给我带来了很大的乐趣(反之,如果你觉得编程很无聊,建议就别干这行了)。我总结了一下,编程为什么会给我带来快乐呢?一在于其创造性,编个程序就像构建一个虚拟世界,有点小孩子搭积木的意思,和写作一样,好玩;二在于回报及时,有个新想法,编个程序就看到结果了,能哄妹子,还能赚钱,这点有点像嗑瓜子,嗑了就吃到了(没人全部嗑完了再一起吃吧?),很开心,所以会停不下来。。。第三呢,觉得自己其实挺笨的。原来觉得自己很聪明,班级里编程我玩得最好,后来发现其实都是自己熬夜刻苦练出经验值来的,和天赋无关。。。坐着那练码,打印出来看着码(自我欣赏),陪老婆逛街还是脑子里练着码,到头来写码也不够快,年纪大了,记性不如从前了,连import都靠IDE自动补齐了,往往越简单的功能写得越慢,当然了,写大程序,可能才有点优势;第四,写码之外的世界更精彩。回顾十几年的生活,自己常以工作为重心,而现在回过头来发现收获最大的、最稳定的却是家庭,是老婆孩子;其次的收获是朋友,来自于一堆不写码的人。朋友们估计也注意到了,我在上面不止一次提到Y同学,每个人一生中都有几个最好的朋友,我大学阶段的挚友是Y同学。在我很多的作品(软件、稿件、图书)中,我都提到了他。他是一个比尔盖茨式的人物,之所以这么说,是因为他酷爱电脑,并且中途辍学,一时传为佳话。不同的是结局,比尔发财了,他没有。当时在班上,我是追求上进的优等生,他是常常缺课挂考的混混,但我们常常在一起讨论理想,包括我不懂的无线电,包括他不懂的C语言,以及比尔和艾伦。大二的时候,来自苏北农村的他花了1万元钱买了台486,这台电脑先后陪伴了我的QBASIC、C和C++,当然也包括西木头的《C & C》和大宇的《仙剑》。杨同学是个爱咬文嚼字的人,也是个多情的人。我们那时候很少想到如何去追女生,但是对《仙剑》的爱情演绎能够评论得头头是道。98年毕业的时候,杨同学一次去南京,给我带回来一本老外写的3D游戏设计,其中讲解了一些3D原理以及编程要点,可惜我并没有深入的看下去。这里也给年轻人提个醒,要做热爱生活的人,该找妹子找妹子,该喝酒的喝酒,该耍流氓耍流氓,不要一直泡在实验室。那样会得痔疮的!!!第五条,深深感到计算机科班出身还是很重要的!我不是科班出身的,按专业来说我应该现在是个八级钳工什么的,但我十几年前选择了计算机!编程看起来很容易入门,很容易得到满足,但是很多基础知识前面没学,后面迟早得补上。随着编程的深入,就需要了解到硬盘IO比内存慢的道理,就需要了解SQL解析和执行的流程,就需要了解外部排序的原理,就需要了解分布式协调的理论。你开始越想躲避的,那些知识点就会像怪兽一样越长越大,某一天冷不丁挡在你前面,好吧,咬紧牙关把它干掉再继续吧!先写这么多吧!后面再补~~~快十点了,脑子开始犯困了。。。++++++++++++++++++++++++++++++++大学同学看到我的帖子,说你怎么忘了写当时写稿子的事?是啊,我怎么能忘记了写稿子的事?再重申一遍了,我是感性的程序员,因此我喜欢舞文弄墨,写了二十年的码,也差不多写了二十多年的文字,以下也带着各位看官回忆回忆^_^(赞呢?)上个世纪末,写作的出处主要就是《电脑爱好者》了。第一篇是关于DOS中断的东东,发表于97年,网上居然还能找到PDF:后来连载多期的是98年的《汉字的处理技术》,那会大家正在闹毕业,大家有的钱都花光了,就我很富裕,一期稿费800元,4期拿到了3200元,然后经常拉着几个要好的哥们搓馆子,还借出去了1000元钱。。。后来一发不可收拾,将掌握的鼠标处理技术转换成了人民币(1998年):98年下半年,我开始了研究生阶段,那时候就有了写C++教程的想法,由于那时候普遍都是C语言,因此我的连载系列命名为《轻轻松松C to C++》,注意还是往《电脑爱好者》投的稿(1999年):我也不知道,《电脑爱好者》为何总是将我的文章放在“步步高”这个栏目?是因为我写的东西很有点步步高的意思?呵呵。。。不过,对于学生时代的我,稿费还算是比较地道的!研究生毕业之后,正式进入工作,《电脑爱好者》的Z先生和我成为了QQ好友,后来我又写了几篇稿子,大抵是关于VC++ GUI方面的。再后来由于和水木清华BBS的几个网友一起办了网站,我就直接把那些文章又发表成网上教程,在网上流传了一段时间。上次我在百度里搜索,发现还有一些网页尸体留存在那里的:恩,再靠后,就是和小编接上头了,开始写书。自己的编程水平其实也不高,但按捺不住要表达自己思想的冲动。最后写的东西里面,除了一些代码,经验杂谈的也很多。。。2007年写了《标准C++开发入门与编程实践》,大抵是觉得网上用VC6.0的程序员太多了,他们整天拿着一些过时的语法折腾来折腾去,对boost、STL却毫不知情,实在是被老教材害得够惨。。。翻开蜥蜴的封面,里面还是能找到我感性的文字的:2009年结合VC,写了本《把脉VC++》,初衷也很简单,就是觉得一堆VC程序员看了一本又一本的编程秘籍,却依然不懂怎么开始一个项目。。。在这本书里,感性的我索性先给出了一张VC编程地图:以上两本书的发行量很小,因此早就没有库存了,也因此证明我发这篇帖子更多的是情怀驱动(感性码农嘛)而非推销驱动!请那些自认为自己的书写得很好的、髙谭浩强一个世纪的牛人(这样的人,据我所知,知乎上还是有的)保持风度,不喜勿喷!最后show一下20年程序员的书架的一角:当然,现在更多的书架被育儿经占领了~~~~最后比较遗憾的是,Java Web从2001年一直做到现在,却一直没能写出一本有意思的书来,也许和自己的脑子也不够灵光了有关吧~~~~下一本是啥题材的?大数据方面的?我不知道。同学。。。点赞?2.2K181 条评论分享收藏感谢收起看了总结图,我这里就总结一下 直接插入排序,冒泡排序,快速排序,堆排序和归并排序,使用C++实现
重新画了总结图
直接插入排序
整个序列分为有序区和无序区,取第一个元素作为初始有序区,然后第二个开始,依次插入到有序区的合适位置,直到排好序
刚开始在我那本《数据结构》看到大概这样的实现
void InsertSort(int arr[], int len) {
for (i = 1; i & i++) {
temp = arr[i];
for (j = i - 1; j &= 0 && arr[j] &j--)
arr[j + 1] = arr[j];
arr[j + 1] =
有点难理解,后来又在网上看到这样的实现,这种方式比较好理解
void InsertSort(int arr[],int n){
for (int i =1;i &=++i){
for(int j =j & 0;--j){
if(arr[j] & arr[j -1]){
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] =
原理都是一样的,第一个for循环对从第二个开始的所有的数字遍历,嵌套的for循环是每次遍历数字时都取无序区的一个元素与有序区的元素比较,如果比有序区的要小则交换,直到合适的位置。
如果使用vector的话会方便一点,因为vector可以使用size()直接获得容器内的元素个数
void InsertSort2(vector&int& &num){
for(int i = 1;i & num.size();++i){
for(int j =j & 0;--j){
if(num[j] & num[j - 1]){
int temp = num[j];
num[j] = num[j-1];
num[j-1] =
插入排序的时间复杂度最好的情况是已经是正序的序列,只需比较(n-1)次,时间复杂度为O(n),最坏的情况是倒序的序列,要比较n(n-1)/2次,时间复杂度为O(n^2 ) ,平均的话要比较时间复杂度为O(n^2 )
插入排序是一种稳定的排序方法,排序元素比较少的时候很好,大量元素便会效率低下
这个图很形象,取自维基百科
比较相邻的元素,如果反序则交换,过程也是分为有序区和无序区,初始时有序区为空,所有元素都在无序区,经过第一趟后就能找出最大的元素,然后重复便可
void BubbleSort(int arr[], int n)
for (int i = 0; i & n - 1; i++) {
for (int j = 0; j & n - i - 1; j++) {
if (arr[j] & arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] =
冒泡排序感觉非常好理解,第一个for循环是遍历所有元素,第二个for循环是每次遍历元素时都对无序区的相邻两个元素进行一次比较,若反序则交换
时间复杂度最坏的情况是反序序列,要比较n(n-1)/2次,时间复杂度为O(n^2 ),最好的情况是正序,只进行(n-1)次比较,不需要移动,时间复杂度为O(n),而平均的时间复杂度为O(n^2 )
但是还有更好的方法,如果第一次比较完没有交换即说明已经有序,不应该进行下一次遍历还有已经遍历出部分有序的序列后,那部分也不用进行遍历,即发生交换的地方之后的地方不用遍历
void BubbleSort(int arr[], int len){
int current,last = len - 1;
while(last & 0) {
for(i = current = 0;i &++i){
if(arr[i] & arr[i+1]){
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] =
图取自维基
冒泡排序也是一种稳定的排序算法,也是元素较少时效率比较高
快速排序首先选一个轴值(pivot,也有叫基准的),将待排序记录划分成独立的两部分,左侧的元素均小于轴值,右侧的元素均大于或等于轴值,然后对这两部分再重复,直到整个序列有序
过程是和二叉搜索树相似,就是一个递归的过程
QuickSort(int arr[], int first, int end){
int pivot = OnceSort(arr,first,end);
QuickSort(arr,first,pivot-1);
QuickSort(arr,pivot+1,end);
接下来就是一次排序的函数
void OnceSort(int arr[], int first, int end){
int i = first,j =
while(i & j){
while(i & j && arr[i] &= arr[j]) --j;
if(i & j){
int temp = arr[i];
arr[i] = arr[j];
while(i & j && arr[i] &= arr[j]) ++i;
if(i & j){
int temp = arr[i];
arr[i] = arr[j];
过程解释都写在注释里面了,挺好理解的这是我在书上看到的实现,用的是递归的方法我在维基上还看到用迭代的方法,这里就不说了,有兴趣的可以去
这个图不是一般的棒!!来自维基
快速排序时间复杂度的最好情况和平均情况一样为O(nlog2 n),最坏情况下为O(n^2 ),这个看起来比前面两种排序都要好,但是这是不稳定的算法,并且空间复杂度高一点( O(nlog2 n)而且快速排序适用于元素多的情况
堆的结构类似于完全二叉树,每个结点的值都小于或者等于其左右孩子结点的值,或者每个节点的值都大于或等于其左右孩子的值
堆排序过程将待排序的序列构造成一个堆,选出堆中最大的移走,再把剩余的元素调整成堆,找出最大的再移走,重复直至有序
来看一下实现
void HeapSort(int arr[],int len){
for(i = len/2 - 1; i &= 0; --i){
Heapify(arr,i,len);
for(i = len - 1;i & 0;--i){
int temp = arr[i];
arr[i] = arr[0];
Heapify(arr,0,i);
再看 调整成堆的函数
void Heapify(int arr[], int first, int end){
int father =
int son = father * 2 + 1;
while(son & end){
if(son + 1 & end && arr[son] & arr[son+1]) ++
if(arr[father] & arr[son]) break;
int temp = arr[father];
arr[father] = arr[son];
arr[son] =
son = 2 * father + 1;
堆排序的时间复杂度最好到最坏都是O(nlogn),较多元素的时候效率比较高
图来自维基
归并排序的基本思想是将若干个序列进行两两归并,直至所有待排序记录都在一个有序序列为止
这个图很有概括性,来自维基
我们也可以用递归的思想,每次合并就是一次递归首先,将一整个序列分成两个序列,两个会分成4个,这样分下去分到最小单位,然后开始合并
void Merge(int arr[], int reg[], int start, int end) {
if (start &= end)return;
int len = end - start, mid = (len && 1) +
int start1 = start, end1 =
int start2 = mid + 1, end2 =
Merge(arr, reg, start1, end1);
Merge(arr, reg, start2, end2);
while (start1 &= end1 && start2 &= end2)
reg[k++] = arr[start1] & arr[start2] ? arr[start1++] : arr[start2++];
while (start1 &= end1)
reg[k++] = arr[start1++];
while (start2 &= end2)
reg[k++] = arr[start2++];
for (k = k &= k++)
arr[k] = reg[k];
void MergeSort(int arr[], const int len) {
Merge(arr, reg, 0, len - 1);
过程解释都写在了注释里
归并排序的时间复杂度都是O(nlogn),并且适用于元素较多的时候排序
1 《数据结构(C++版)》2 维基百科
阅读(...) 评论()}

我要回帖

更多关于 excel怎么编号排序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信