<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:content="http://purl.org/Rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><channel><title>望穿秋水</title><link>http://mcs.szu.edu.cn/user/shichengxi      /Rss</link><description></description><language>zh-cn</language><pubDate>Thu, 11 Mar 2010 18:31:42  +0800</pubDate><generator>welego</generator><image><title>望穿秋水</title><url>http://mcs.szu.edu.cnattavatar_1/shichengxi.JPG</url><link>http://mcs.szu.edu.cn/user/shichengxi      /Rss</link></image> <item><link>http://mcs.szu.edu.cn/Article/2485</link><title><![CDATA[拓扑排序算法]]></title><author>shichengxi</author><category>编程艺术</category><pubDate>Mon, 05 Mar 2007 00:23:05  +0800</pubDate><description><![CDATA[<p><font face="Arial" size="2">&nbsp;</font></p>
<p class="MsoNormal" style="TEXT-ALIGN: center" align="center">
<font face="Arial"><span><font size=
"4"><strong>拓扑排序算法<o:p></o:p></strong></font></span></font></p>
<p class="MsoNormal" style="TEXT-ALIGN: center" align="center">
<strong><span lang="EN-US" style=
"FONT-SIZE: 13.5pt; FONT-FAMILY: ??"><o:p><font face="Arial" size=
"2">&nbsp;</font></o:p></span></strong></p>
<p class="MsoNormal"><span style=
"FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><font face="Arial" size=
"2">一个复杂的工程通常可以分解成一组小任务的集合，完成这些小任务意味着整个工程的完成。例如，汽车装配工程可分解为以下任务：将底盘放上装配线，装轴，将座位装在底盘上，上漆，装刹车，装门等等。任务之间具有先后关系，例如在装轴之前必须先将底板放上装配线。任务的先后顺序可用有向图表示<span lang="EN-US">——</span>称为顶点活动（
<span lang="EN-US">Activity On Vertex,
AOV</span>）网络。有向图的顶点代表任务，有向边<span lang="EN-US">(i, j)</span>
表示先后关系：任务<span lang="EN-US">j</span> 开始前任务<span lang=
"EN-US">i</span> 必须完成。图<span lang="EN-US">1 - 4</span>显示了六个任务的工程，边（
<span lang="EN-US">1 , 4</span>）表示任务<span lang=
"EN-US">1</span>在任务<span lang="EN-US">4</span>开始前完成，同样边（
<span lang="EN-US">4 , 6</span>）表示任务<span lang=
"EN-US">4</span>在任务<span lang="EN-US">6</span>开始前完成，边（<span lang=
"EN-US">1 , 4</span>）与（<span lang="EN-US">4 ,
6</span>）合起来可知任务<span lang="EN-US">1</span>在任务<span lang=
"EN-US">6</span>开始前完成，即前后关系是传递的。由此可知，边（<span lang="EN-US">1 ,
4</span>）是多余的，因为边（<span lang="EN-US">1 , 3</span>）和（<span lang=
"EN-US">3 , 4</span>）已暗示了这种关系。</font> <font face=
"Arial"><font size="2"><span lang="EN-US"><br>
<br></span>在很多条件下，任务的执行是连续进行的，例如汽车装配问题或平时购买的标有<span lang=
"EN-US">“</span>需要装配<span lang=
"EN-US">”</span>的消费品（自行车、小孩的秋千装置，割草机等等）。我们可根据所建议的顺序来装配。在由任务建立的有向图中，边（
<span lang="EN-US">i, j</span>）表示在装配序列中任务<span lang=
"EN-US">i</span> 在任务<span lang="EN-US">j</span>
的前面，具有这种性质的序列称为拓扑序列（<span lang="EN-US">topological
orders</span>或<span lang="EN-US">topological
sequences)</span>。根据任务的有向图建立拓扑序列的过程称为拓扑排序（<span lang=
"EN-US">topological sorting</span>）。图<span lang="EN-US">1 -
4</span>的任务有向图有多种拓扑序列，其中的三种为<span lang="EN-US">1 2 3 4 5
6</span>，<span lang="EN-US">1 3 2 4 5 6</span>和<span lang="EN-US">2
1 5 3 4 6</span>，序列<span lang="EN-US">1 4 2 3 5
6</span>就不是拓扑序列，因为在这个序列中任务<span lang="EN-US">4</span>在<span lang=
"EN-US">3</span>的前面，而任务有向图中的边为（ <span lang="EN-US">3 ,
4</span>），这种序列与边（ <span lang="EN-US">3 ,
4</span>）及其他边所指示的序列相矛盾。可用贪婪算法来建立拓扑序列。算法按从左到右的步骤构造拓扑序列，每一步在排好的序列中加入一个顶点。利用如下贪婪准则来选择顶点：从剩下的顶点中，选择顶点<span lang="EN-US">w</span>，使得<span lang="EN-US">w</span>
不存在这样的入边（ <span lang="EN-US">v,w</span>），其中顶点<span lang=
"EN-US">v</span> 不在已排好的序列结构中出现。注意到如果加入的顶点<span lang=
"EN-US">w</span>违背了这个准则（即有向图中存在边（ <span lang=
"EN-US">v,w</span>）且<span lang="EN-US">v</span>
不在已构造的序列中），则无法完成拓扑排序，因为顶点<span lang="EN-US">v</span>
必须跟随在顶点<span lang="EN-US">w</span> 之后。贪婪算法的伪代码如图<span lang=
"EN-US">1 3 - 5</span>所示。<span lang="EN-US">while</span>
循环的每次迭代代表贪婪算法的一个步骤。</font></font> <font face="Arial"><font size=
"2"><span lang="EN-US"><br>
<br></span>现在用贪婪算法来求解图<span lang="EN-US">1 -
4</span>的有向图。首先从一个空序列<span lang="EN-US">V</span>开始，第一步选择<span lang=
"EN-US">V</span>的第一个顶点。此时，在有向图中有两个候选顶点<span lang=
"EN-US">1</span>和<span lang="EN-US">2</span>，若选择顶点<span lang=
"EN-US">2</span>，则序列<span lang="EN-US">V =
2</span>，第一步完成。第二步选择<span lang=
"EN-US">V</span>的第二个顶点，根据贪婪准则可知候选顶点为<span lang=
"EN-US">1</span>和<span lang="EN-US">5</span>，若选择<span lang=
"EN-US">5</span>，则<span lang="EN-US">V = 2
5</span>。下一步，顶点<span lang="EN-US">1</span>是唯一的候选，因此<span lang=
"EN-US">V = 2 5 1</span>。第四步，顶点<span lang=
"EN-US">3</span>是唯一的候选，因此把顶点<span lang=
"EN-US">3</span>加入</font></font><font face="Arial"><font size=
"2"><span lang="EN-US">V<br>
<br></span> 得到<span lang="EN-US">V = 2 5 1
3</span>。在最后两步分别加入顶点<span lang="EN-US">4</span>和<span lang=
"EN-US">6</span> ，得<span lang="EN-US">V = 2 5 1 3 4
6</span>。</font></font> <font face="Arial"><font size=
"2"><span lang="EN-US"><br>
<br>
1.</span> 贪婪算法的正确性</font></font> <font face="Arial"><font size=
"2"><span lang="EN-US"><br>
<br></span>为保证贪婪算法算的正确性，需要证明： <span lang="EN-US">1)</span>
当算法失败时，有向图没有拓扑序列； <span lang="EN-US">2)</span> 若</font></font>
<font face="Arial"><font size="2"><span lang="EN-US"><br>
<br></span>算法没有失败，<span lang="EN-US">V</span>即是拓扑序列。<span lang=
"EN-US">2)</span> 即是用贪婪准则来选取下一个顶点的直接结果， <span lang=
"EN-US">1)</span> 的证明见定理<span lang="EN-US">1 3 -
2</span>，它证明了若算法失败，则有向图中有环路。若有向图中包含环<span lang="EN-US">qj qj + 1.qk
qj ,</span> 则它没有拓扑序列，因为该序列暗示了<span lang="EN-US">qj</span>
一定要在<span lang="EN-US">qj</span> 开始前完成。</font></font> <font face=
"Arial"><font size="2"><span lang="EN-US"><br>
<br></span>定理<span lang="EN-US">1-2</span> 如果图<span lang="EN-US">1
3 - 5</span>算法失败，则有向图含有环路。</font></font> <font face=
"Arial"><font size="2"><span lang="EN-US"><br>
<br></span>证明注意到当失败时</font></font><font face="Arial"><font size=
"2"><span lang="EN-US">| V |<br>
<br>
2.</span> 数据结构的选择</font></font> <font face="Arial"><font size=
"2"><span lang="EN-US"><br>
<br></span>为将图<span lang="EN-US">1 - 5</span>用<span lang="EN-US">C
+ +</span>代码来实现，必须考虑序列<span lang=
"EN-US">V</span>的描述方法，以及如何找出可加入<span lang=
"EN-US">V</span>的候选顶点。一种高效的实现方法是将序列<span lang=
"EN-US">V</span>用一维数组<span lang="EN-US">v</span>
来描述的，用一个栈来保存可加入<span lang="EN-US">V</span>的候选顶点。另有一个一维数组<span lang=
"EN-US">I n D e g r e e</span>，<span lang="EN-US">I n D e g r e e[
j ]</span>表示与顶点<span lang="EN-US">j</span>相连的节点<span lang=
"EN-US">i</span> 的数目，其中顶点<span lang="EN-US">i</span>不是<span lang=
"EN-US">V</span>中的成员，它们之间的有向图的边表示为（ <span lang="EN-US">i,
j</span>）。当<span lang="EN-US">I n D e g r e e[ j
]</span>变为<span lang="EN-US">0</span>时表示<span lang="EN-US">j</span>
成为一个候选节点。序列<span lang="EN-US">V</span>初始时为空。<span lang="EN-US">I n
D e g r e e[ j ]</span>为顶点<span lang="EN-US">j</span>
的入度。每次向<span lang="EN-US">V</span>中加入一个顶点时，所有与新加入顶点邻接的顶点<span lang=
"EN-US">j</span>，其<span lang="EN-US">I n D e g r e e[ j
]</span>减<span lang="EN-US">1</span>。对于有向图<span lang="EN-US">1 -
4</span>，开始时<span lang="EN-US">I n D e g r e e [ 1 : 6 ] = [ 0 , 0
, 1 , 3 , 1 , 3 ]</span>。由于顶点<span lang=
"EN-US">1</span>和<span lang="EN-US">2</span>的<span lang="EN-US">I n
D e g r e e</span>值为<span lang="EN-US">0</span>，因此它们是可加入<span lang=
"EN-US">V</span>的候选顶点，由此，顶点<span lang="EN-US">1</span>和<span lang=
"EN-US">2</span>首先入栈。每一步，从栈中取出一个顶点将其加入<span lang=
"EN-US">V</span>，同时减去与其邻接的顶点的<span lang="EN-US">I n D e g r e
e</span>值。若在第一步时从栈中取出顶点<span lang="EN-US">2</span>并将其加入<span lang=
"EN-US">V</span>，便得到了<span lang="EN-US">v [ 0 ] =
2</span>，和<span lang="EN-US">I n D e g r e e [ 1 : 6 ] = [ 0 , 0 ,
1 , 2 , 0 , 3 ]</span>。由于<span lang="EN-US">I n D e g r e e [ 5
]</span>刚刚变为<span lang="EN-US">0</span>，因此将顶点<span lang=
"EN-US">5</span>入栈。</font></font> <font face="Arial"><font size=
"2"><span lang="EN-US"><br>
<br></span>程序<span lang="EN-US">1 3 - 2</span>给出了相应的<span lang=
"EN-US">C + +</span>代码，这个代码被定义为<span lang="EN-US">N e t w o r
k</span>的一个成员函数。而且，它对于有无加权的有向图均适用。但若用于无向图（不论其有无加权）将会得到错误的结果，因为拓扑排序是针对有向图来定义的。为解决这个问题，利用同样的模板来定义成员函数<span lang="EN-US">AdjacencyGraph,
AdjacencyWGraph</span>，<span lang="EN-US">L i n k e d G r a p
h</span>和<span lang="EN-US">L i n k e d W G r a p
h</span>。这些函数可重载<span lang="EN-US">N e t w o r
k</span>中的函数并可输出错误信息。如果找到拓扑序列，则<span lang=
"EN-US">Topological</span> 函数返回<span lang="EN-US">t r u
e</span>；若输入的有向图无拓扑序列则返回<span lang="EN-US">f a l s
e</span>。当找到拓扑序列时，将其返回到<span lang="EN-US">v [ 0 :n- 1
]</span>中。</font></font> <font face="Arial"><font size=
"2"><span lang="EN-US"><br>
<br>
3. Network:Topological</span> 的复杂性</font></font> <font face=
"Arial"><font size="2"><span lang="EN-US"><br>
<br></span>第一和第三个<span lang="EN-US">f o r</span>循环的时间开销为<span lang=
"EN-US">(n )</span>。若使用（耗费）邻接矩阵<span lang=
"EN-US">,</span>则第二个<span lang="EN-US">for</span>
循环所用的时间为<span lang="EN-US">(n2 )</span>；若使用邻接链表<span lang=
"EN-US">,</span>则所用时间为<span lang=
"EN-US">(n+e)</span>。在两个嵌套的<span lang="EN-US">while</span>
循环中，外层循环需执行<span lang="EN-US">n</span>次，每次将顶点<span lang=
"EN-US">w</span> 加入到<span lang="EN-US">v</span> 中，并初始化内层<span lang=
"EN-US">while</span> 循环。使用邻接矩阵时，内层<span lang="EN-US">w h i l
e</span>循环对于每个顶点<span lang="EN-US">w</span> 需花费<span lang=
"EN-US">(n)</span>的时间；若利用邻接链表，则这个循环需花费<span lang=
"EN-US">dwout</span> 的时间，因此，内层<span lang="EN-US">while</span>
循环的时间开销为<span lang="EN-US">(n2 )</span>或<span lang=
"EN-US">(n+e)</span>。所以，若利用邻接矩阵，程序<span lang="EN-US">1 3 -
2</span>的时间复杂性为<span lang="EN-US">(n2 )</span>，若利用邻接链表则为<span lang=
"EN-US">(n+e)</span>。</font></font> <font face="Arial"><font size=
"2"><span lang="EN-US"><br>
<br></span>程序<span lang="EN-US">13-2</span> 拓扑排序</font></font>
<font face="Arial"><font size="2"><span lang="EN-US"><br>
<br>
bool Network::Topological(int v[])<br>
<br>
{//</span> 计算有向图中顶点的拓扑次序</font></font> <font face=
"Arial"><font size="2"><span lang="EN-US"><br>
<br>
//</span> 如果找到了一个拓扑次序，则返回<span lang="EN-US">t r u
e</span>，此时，在<span lang="EN-US">v [ 0 : n - 1
]</span>中记录拓扑次序</font></font> <font face="Arial"><font size=
"2"><span lang="EN-US"><br>
<br>
//</span> 如果不存在拓扑次序，则返回</font></font><font face="Arial"><font size=
"2"><span lang="EN-US">f a l s e<br>
<br>
int n = Ve r t i c e s ( ) ;<br>
<br>
//</span> 计算入度</font></font> <font face="Arial"><font size=
"2"><span lang="EN-US"><br>
<br>
int *InDegree = new int [n+1];<br>
<br>
InitializePos(); //</span> 图遍历器数组</font></font> <font face=
"Arial"><font size="2"><span lang="EN-US"><br>
<br>
for (int i = 1; i &lt;= n; i++) //</span> 初始化</font></font>
<font face="Arial"><font size="2"><span lang="EN-US"><br>
<br>
InDegree[i] = 0;<br>
<br>
for (i = 1; i &lt;= n; i++) {//</span> 从<span lang="EN-US">i</span>
出发的边</font></font> <font face="Arial"><font size="2"><span lang=
"EN-US"><br>
<br>
int u = Begin(i);<br>
<br>
while (u) {<br>
<br>
I n D e g r e e [ u ] + + ;<br>
<br>
u = NextVe r t e x ( i ) ; }<br>
<br>
}<br>
<br>
//</span> 把入度为０的顶点压入堆栈</font></font> <font face="Arial"><font size=
"2"><span lang="EN-US"><br>
<br>
LinkedStack S;<br>
<br>
for (i = 1; i &lt;= n; i++)<br>
<br>
if (!InDegree[i]) S.Add(i);<br>
<br>
//</span> 产生拓扑次序</font></font> <font face="Arial"><font size=
"2"><span lang="EN-US"><br>
<br>
i = 0; //</span> 数组<span lang="EN-US">v</span> 的游标</font></font>
<span lang="EN-US"><br>
<br>
<font face="Arial" size="2">while (!S.IsEmpty()) {//</font></span>
<font face="Arial" size="2">从堆栈中选择</font> <font face=
"Arial"><font size="2"><span lang="EN-US"><br>
<br>
int w; //</span> 下一个顶点</font></font> <font face="Arial"><font size=
"2"><span lang="EN-US"><br>
<br>
S . D e l e t e ( w ) ;<br>
<br>
v[i++] = w;<br>
<br>
int u = Begin(w);<br>
<br>
while (u) {//</span> 修改入度</font></font> <span lang=
"EN-US"><font face="Arial"><font size="2"><br>
<br>
I n D e g r e e [ u ] - - ;<br>
<br>
if (!InDegree[u]) S.Add(u);<br>
<br>
u = NextVe r t e x ( w ) ;
}<o:p></o:p></font></font></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style=
"FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><o:p><font face="Arial" size=
"2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style=
"FONT-SIZE: 9pt; FONT-FAMILY: 宋体"><font face="Arial"><font size=
"2">}<br>
<br>
D e a c t i v a t e P o s ( ) ;<br>
<br>
delete [] InDegree;<br>
<br>
return (i == n);<o:p></o:p></font></font></span></p>

]]></description><guid>http://mcs.szu.edu.cn/Article/2485</guid><trackback:ping>http://mcs.szu.edu.cn/Article/2485/trackback</trackback:ping><comments>http://mcs.szu.edu.cn/Article/2485#comment</comments><wfw:commentRss>http://mcs.szu.edu.cn/Article/2485/commentRss</wfw:commentRss></item> <item><link>http://mcs.szu.edu.cn/Article/1217</link><title><![CDATA[[转]如何成为一名优秀的程序员]]></title><author>shichengxi</author><category>编程艺术</category><pubDate>Wed, 10 Jan 2007 21:09:34  +0800</pubDate><description><![CDATA[<p align="center"><font face="Tahoma"><strong><font size=
"4"><img alt="" src=
"http://blog.szu.edu.cn/htmledit/editor/images/smiley/msn/ext_07.gif">如何成为一名优秀的程序员</font></strong></font></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><font face="Tahoma">一位仁兄说的“程序员写的程序不是算法+语法 ，而是要能够满足用户需求的工
具”我非常赞同，要想达到用户需求就必须从各个方面来考虑如业务、人机交互
、效率等方面，而不只是一个语言（语法）的问题，语言（语法）只是工具，只 知语法不知其他那就真是编程机器了！
编程机器在印度高中生经过几个月培训，按照严谨的软工方法，加上较高的管理
，就可以胜任了！大家相信吗，我是相信的！谈到这里我就不禁说到了国内教育
界最近在探讨的问题“计算机科系的毕业生特别是本科大专生到底出来干啥、如
何适应社会要求”，大家也看到了很多计科系大学生说精通N种语言，熟悉N种工
具，不知道学校里的其他知识到那里去了，甘愿做编程机器，浪费了人民的纳税
，干高中生能干的事，比较可惜吧！在国内现在就是这样了，看过一则帖子：清华的计科系毕业声在建筑院里搞开发还不如建筑专业的毕业生。说着说着就岔道
了，国内的软件开发业到底是需要那些人：如果仅仅是编码机器，那我估计中国 硅谷还是做梦去吧！<br>
社会似乎也需要编码机器，翻翻招聘广告，做应用开发的都要求精通某某语言，
熟悉某某工具，很少需要懂管理懂软工的人。以我个人一点偏激的想法，民族软
件产业要腾飞，更需要的是能管理使用编码机器的人，即管理人员、国内软件产 业编码机器已经很多了。希望不要惹怒了那些编程高手！
system develop与Application develop在国内到底哪个能养活你，能赚钱，诸位
仁兄想必也知道，况且俺也没发现几家水平高的公司招这方面的人，毕竟OS，DB
MS，COMPILER都被国外做了、另外也别跟我谈LINUX，毕竟还是少数烧钱的人做的
事情，我先喂饱肚皮再说。我手下的很多搞4GL语言的程序员都想转行学VC等所谓
的更低级的语言，我总是说“在XX城市，先用4GL工具生存，以后再学习VC吧！”
，说的简单一点先解决肚子问题。如何判断自己是否是编程机器？<br>
1、面对需求不考虑用户，只是考虑用那些程序技术展示自己的语言语法技巧 .<br>
2、学习了N种语言 .<br>
3、从来不学习或实践软工 .<br>
4、语法语言水平在众人中遥遥领先、特别是一些稀奇古怪的语法 凭着兴趣和创造力去干，却重复繁琐的劳动。
做着没有意义-唯一意义是赚钱，而且真是出了半斤力， 拿不足八两。 终日劳累，却不能学自己想学的。最终结果是跟不上社会科技的发展
，人已衰老。悲哀！！！<br>
　</font></p>
<p><font face="Tahoma">开发软件的关键是要有想法，一个好的想法比什么都重要。尤其是有关
网络方面的就更是如此。</font></p>
<p><font face="Tahoma">入门还可以，但是要继续深入了解可能要难点。 未必吧 偶觉得大学里的高数 数理方法之类的,
如果你不是做研究的话, 应该是很少能 用到的 不过如果说到离散之类的,
倒还是时不时的能有点用现在的程序员比起十年前是不是要花更多的时间来 查帮助呢。系统越来越大，手册越来越厚，软件开发的
周期是不是越来越多的淹没在查帮助之中了呢。</font></p>
<p><font face=
"Tahoma">实际上一个程序员最终的技术需要和实际相结合。真正在编写程序到达一定时候，语言的使用并不是最大的障碍，对整个项目的把握、软件工程的把握、数据库的设计以及执行效果的分析等等才是需要进一步考虑的东东！否则，为何大多数公司到要求有编程经验了！这些不是程序员必须学的。但数据结构，编译原理，操作系统原理等是必须要学好的，英文的多看，不懂计算机英语可不行。实我不是什么中专生,而是我读的中学和一个私人办的电脑学校联合开的电脑专业(并不是我中考考的差,而是这个学校太贪钱了,才被录取到这里,恼火,我们班里中考成绩从两百多到四百多的都有,我就是四百多分(重理轻文的结果,要不然...),当时读书的时候,我是班是的高手(其实只是比其它同学懂而已),大家叫我dos,因为当时学的都是dos的内容,
毕业后还没有对编程很感兴趣,只想找一个电脑的工作就可以了,哪怕是打字的,可是看报纸,去人才中心,看到都是要大学的,为此感到很失望.也对电脑失去了兴趣.后来学校打电话到我家,说厦门厦华公司要招工,要不要去,我很快就答应了,因为当时没工作,天天呆在家里.后来打工的时候,天天象一个机械人一样,重复着同一道工序,因此经常在深夜的时候,思索着自己的未来,由此重新生起了对电脑的感情,因此经常买电脑杂志和报纸看(可以堆成一座山了).由于离我住的地方不远处,有一个电脑培训的,所以经常到那里上机,而在学校里学过的软件也只有FOXBASE和WPS,其它的不值一提,所以上机经常用foxbase,直到这时候,才对编程产生了浓厚的兴趣,一年后,自已买了一台电脑,开始认真学习编程.由于我是属于职业中专的,因此经常想,就算学得再好也没有用,所以想考程序员,而考程序员要懂得c语言,所以就学习turbo
c,学完了,学数据结构,同时看'C高级实用程序设计',澳门回归和2000年的两个晚上,我都是在编程中度过的.由于我这个人对书很感兴趣,经常在星期六,星期七去书店,而在书店里,也是看编程方面的书,而看到的编程书籍大部份都是windows方面的,为此也经常思索着学dos编程到底有没有用.后来,春节放假(要2月13日上班)回老家,天天去新华书店(正月初一也去),看到也都是windows编程方面的书多得像狗屎一样,所以就下决心学windows编程,因此正月初四(快餐店还没有开张)就去厦门了,很快买了delphi的书和d版delphi5,疯狂地学习(到目前为止,买了8本delphi的书,因为国人的写的书实在太烂),而由于遇到不懂的又不知道怎么办,为此想到了网络,但在外打工不可能上网(上网吧太贵),所以就辞职了(4月21日),现在,程序员考试快到了,是报还是不报一直犹豫不觉,困此才有此问题.打工的岁夜,我永远不会忘记,因为付出太多了,也失去了太多(坏了两个光驱,瘦了几斤),直到现在,脑海里还不时浮现起那几个无眠的夜晚.忠心感谢大家.我不认为编码的人就是机器,
而系统分析就不是机器, 其实系统分析员就是销售的机器, 所有职员有是老板的机器.它们之间这是不同工种吧了,
当然对系统分析要求要高一些, 薪水也高一些, 但更让人佩服的是销售, 是他们驱动了整个的运作.我也是个中专生,
还是学机械的(后来自学了计算机), 我非常了解在传统的制造业是如何的规范, 设计人员设计图纸, 然后经审核, 再到车间试样,
再根据情况, 修改图纸, 如此反复几次后才能一个产品定型,而在软件界, 就没那么好了, 领导会说, 这个你做, 那个他做,
也没有经过很细的分析(国内很多都是这样), 在我们这里也没有系统分析员, 每个人都是设计员, 也是编程员, 虽然这样对个人来说,
能学到很多东西, 但不利于项目.我国的软件过程水平,确实令人担忧, 目前为止只是, 几个人十几个人的小软件,
还没有能拿得手的大型软件.至于中专生编程问题, 我<br>
认为只要入了这个行, 就不会比本科生差, 因为对他来说没有优越的学历条件, 那么只好埋头苦学,
但这正好适应当前计算机软件迅速发展的今天, 学历只能代表过去和基础, 更需要的是有能力的人, 解决问题的人,
实干的人.对我来说确实有时有点自卑, 没有上过高中和大学(由于那个年代, 我只知道能为父母减少一点负担就行了),
所有我一直在努力的学习(corba, uml, java, 软件过程等), 目前为止我并没有觉的我的构架能力和编码水平比他们差,
只是觉得E语言实在太差.过计算机本科又如何？我有几个同学到银行去搞业务了，有同学任教，有同学收税去了......60多个人真正现在搞计算机的还就只有几个人，再看看当时这些计算机本科生的毕业设计,faint有的人到最后连vb都搞不定，但他们什么编译原理啦什么组成原理啦什么软件工程啦学的（应该是考试的分数）真还不<br>
错，至少我感觉有些概念比我清楚（上课没听)所以我觉的中专生并不比一般大学生差（当然有些重点学校除外hehe)，有时中专生有更大的压力逼迫自己去学习，学历不是重要的，关键是一个人的素质.我们不能将目标定位在做程序员或编码员（Coder)上光会写代码有什么用？那叫“编码员”，在国外是属于体力劳动的，不像国内，会写程序的就叫高科技。重要的是分析问题、解决问题和规划的能力，系统分析，系统设计及项目规划才是正途。这就需要学习所谓的基础课程了，如：软件工程、离散数学、数据结构等等。从vb到现在开始学vc后，一个人捣鼓了几天也没有什么新发现。跟本不知道VC的编程思想是什么，请大虾们告诉我，它和VB的差别真是太大了。VC的博大在于MFC的操纵,它是Win32API的封装.思想在于怎样了解MFC的内幕,它的运行机制.差别也大，差别也不大！这要看你对API的理解了，虽然VC++的可视化没有VB的好，但是不是绝对没有的，其对而且对话框的编辑是跟VB一样的，不过不是像VB那样放在第一个界面罢了，VC++的博大精深是VB难以望其项背的！：）而且VC++是完全面向对象的编程工具，而<br>
VB是不够完全的面向对象编程工具，VC++是完全编译语言，VB是本地编译语言，不够完全，VC++效率高，封装性好，继承性高，VB效率相对低了很多，但界面友好，二者只能取其一，或者使用VC++，VB辅助(因为VB开发快)，当然Delphi，BCB也是不错的选择。</font></p>
<p><font face=
"Tahoma">程序员不应依赖开发工具，程序员更应该拥有的是一种思维、一种精神、一种观念。就像Richard.M.Stallman一样，有自己的精神，为自由软件而奋斗。就像求伯君，为民族软件的振兴而奋斗。这才是真正的程序员。<br>
应该说，他们更注重的不是技术，而是软件的思维，软件的灵魂！！我刚学ＶＣ的时候,还没有上网.身边也没有一个可以问的朋友,所以大部份都是自己啃的.那种感觉真是很痛苦.
现在在网上就不同了,可以得到太多的资料了,而且还可以得到在线帮助.但这些都不是学习的关键.
相信各位也知道ＶＣ的难度,并不是那么容易上手的,所以要想学会,学好ＶＣ,靠外力是不可能的.主要得靠自己.
自己要有一份难得的毅力,对编程的狂热也可以在一定程序上起到帮助.我就是这样的.起初,没有人帮我,我学习ＶＣ是三天打鱼两天晒网,学习进度很慢,幸好对编程的执著,使得自己坚持下来了.
如果你从来就没有接触过编程,那你学习ＶＣ的速度可能会比学过面向过程编程的人要慢一些,因为你要去理解命令及语句的含义.但只要你努力,并且可以得到别人的帮助,我相信在半年内会对ＶＣ有一定的认识.
请学赤面向过程编程的朋友也不要笑,因为面向过程与面向对象实在是区别太大了.就拿封装一词来说吧.当初我是左想右想才想通的.所以不要自己学过编程,就会在学习ＶＣ的通道上比别人轻松.
现在有一种现状应该让我们注意.我发现有很大一部份初学者觉得ＶＣ是一种语言,Ｃ++又是另一各语言.我在和一些初学者的交谈当中,查觉到了这一点.有的初学者竟然还认为我学ＶＣ为什么就一定要学Ｃ++我想这个问题是我们大家都没有注意到的一个问题.就是向初学者讲述Ｃ++对ＶＣ学习的重要性.
我这有个例子,跟大家讲一下.
我有个同学,他接触编程比我要早,在我还在为ＶＣ中符号怎么标记的时候,他已经在学习Ｃ了.后来,我对ＶＣ稍有理解的时候,他也发觉Ｃ的跟不上时代的脚步了.我便提议他从Ｃ++语言学起,可他认为自己有Ｃ的学习功底,根本就用不着再去学习Ｃ++.可在学习ＶＣ的当中,遇到的困难真是数不胜数.最近,他还是去买了一本学习Ｃ++的书.从头再来学习Ｃ++.
我希望通过这个例子,能让广大的初学者知道,Ｃ++对ＶＣ学习的重要性。<br>
学习VC必须有狂热的编程热情，否则是很难坚持下来的，我周围就有几个这样的人，他们比我先学VC近半年，但现在仍然学不会，而我现在虽说不是很厉害，但基本的应用程序是不在话下，我就是天天看书，上机实践，几乎所有的时间都泡在里面，有时连吃饭都在想，为什么，因为我确实想啃下这块硬骨头，我不想半途而废，我觉得学习VC不仅仅是学到了更多的东西，最主要的是培养了我们自己一种坚持克服困难的毅力。<br>
对于VC，我有几点经验：<br>
1。技术为本，语言为次.<br>
2。MFC的单个类有用，DOCVIEW要小心。<br>
3。OOP要小心，使用不当反而造成大量的工作和糟糕的代码。<br>
4。如果可能，考虑选择使用Delphi(CBuilder+VCL)。<br>
5。到了一定程度，一定要学COM。<br>
要学VC，必须有对C++深刻的理解，对WINDOWS运行机制的深刻理解。尤其想成为VC高手。举例 ，
对于虚函数，不仅要知道有这么一个东东，更要知道它的内存镜像
。这样才能对VC中很多的东西举一反三，事半功倍。本人学习VC近2年，但自觉第一年由于心情浮躁，把VC的书翻了一遍又一遍，却每次都只看了一点就无法再深入。直到毕业前夕，痛定思痛，克服浮躁，认认真真的从最基本的开始学，把每一点都搞的水落石出，经过三个月的刻苦，终于大成。直到现在，半月搞定COMDCOM，都托当日刻苦之福，因此劝告想学VC的朋友，一定要顶住开始的艰难岁月。成功属于刻苦者。</font></p>
<p><font face="Tahoma">每个人都有自己的学习方法,也许这种方法对我来说有用,但不见
得就对所有的人有用.所以,请不要盲目的跟着别人的学习方法学习,要思考属于自己的学习方法.
但我还是会向大家说出我自己认为比较好的一种方法.
学习编程其实与学习其它东西一样,要想掌握它,就要实践,实践,再实践.当你学到了一种新的技术或知识时,多实践是巩固学习的一种最好最有效的方法.
这个实践不是照著书上的例子做一遍,而是根据自己的能力,给自己出题,然后去完成它.只有这样,你才能发现自己的不足,同时又增加了自己的编程经验.
但要成为合格的程序员,光<br>
会写代码是远远不够的,更重要的是思考.谋定而后动,是 不变的真理.<br>
在我的理解，VC只是一个编程工具，就如BC、BCB、Delphi 一样，其实对于编程最根本的就是三个方面，语言、开发包、
操作系统API，他们三个方面应该说是相对比较独立的。</font></p>
<p><font face="Tahoma">VC是MS开发的，所以针对的是windows api，你可以不会C++，
也可以在VC下用C写出很优秀的程序，当然如果你比较熟练C++，
并且熟悉开发包MFC的话，工作可能要轻松不少。所以在我看来，学习的过程可以是这样的：<br>
1、先学习C或C++，在windows的console环境下编写不太深入涉及API的程序；<br>
2、在基本上掌握了语法之后，开始接触简单的系统API，学习 Windows的编程原理和机制；<br>
3、在可以编写简单的菜单程序，可以简单地在WM_PAINT下操作 GDI函数后，开始学习MFC，可以从Step
tourist学起，看MFC的源代码，理解几个关键的宏的定义与实现，特别是MESSAGE MAP。
在学习的过程中为了给自己增加点挑战，尽量不要使用resource edit，试着自己编码实现控件的创建，消息的响应。
再就是看自己的造化了，动手做一些小工具，特别是自己平常需要的，对自己的提高也应该是很有帮助。
究竟我们要的是结果！良好的分析问题高效清晰地肢解问题的能力才是我们真正要不断学习的吧？</font></p>
<p><font face=
"Tahoma">和学习其他知识一样，重要的是获得提出问题，分析问题，解决问题的能力，不是为编程而学习，你具有什么样的思想，就会写出什么样的程序。学一门语言，不能仅仅是语言，要注重语言背后的思想方法，看他是如何来解决某一问题的，为什么要这样去做，他总是要符合客观事实的，就像人说的话一样，存在某种逻辑，数据的组织，信息的传递，靠你自己的头脑去建立，然后看C++中有什么可以帮你的，该怎么样用他来表达自己的想法。只要你认真实践，努力去做，寻求乐趣，就会达到目标。我虽然
真正认真学习编程的时间不长，但现在我是认真的，就有了以上的体会。</font></p>
<p><font face="Tahoma">学习VC++有相当的内容要学，而最后的深度则看个人的悟性与勤奋了。<br>
1）掌握最新标准的C++。(2个月)<br>
如果曾经在大学里自以为学过CC++,还对dynamic_caststatic_casttemplatetrycatchthrowstl...感到<br>
陌生，那你该Refresh一下新的ANSI C++标准了。
----此与VC++无甚关联，g++bcb均有所支持。</font></p>
<p><font face="Tahoma">2） 学习SDK编程；-O （6个月） 痛苦是暂时的，必要的，坚持就是胜利！
建议用Lccwin32Masm32Tasm编写小而精的工具软件； Windows Programming Guide.
Advanced Windows programming</font></p>
<p><font face="Tahoma">3） 研究MFC源代码。(6个月)<br>
不要被一大堆的宏所蒙蔽，just track and dig into it!!
在知道MFC如何扩展，包装SDK之后，自可功力渐进，不被其MFC系统框架所困绕。MFC Internals</font></p>
<p><font face="Tahoma">4） 研究OLECOM技术。<br>
COMActiveX技术是MS的核心技术，只有彻底洞察其理论精髓才可以体会现在的<br>
操作系统的技术趋势，以不变应万变。<br>
Inside Ole 2</font></p>
<p><font face="Tahoma">几点建议：<br>
1)
DelphiBCBVB可以很快构筑界面，但对于想真正学习、理解系统不是一个好的平台，但如果有时间读一读VCL的源码，看看Borland是如何封装系统的，也可借鉴不少。<br>
2) 学习ASM对理解C++有很大益处。Soft-ICE也是和VC++结合在一起的好工具;<br>
3)
语言本身是皮毛，算法是筋骨；无论高级语言如何发展，在理解操作系统的基础上不断自我创新的能力是源源不断的；如果精髓一旦了然于胸，选择何种开发工具都可以驾御，一见如故了。</font></p>
<p><font face=
"Tahoma">每个人学习的过程都会不同吧，我在98从TC转向VC时，对Windows的消息机制一点概念也没有，对着个MFC不知所措，几个月下来一点进展也没有。我于是暂时转向win32位编程。整整一年时间吧，我就是与API打交道，连编辑菜单条对话框等资源文件时也用Uedit32手工编写，为的是希望能对编译器的全过程有个感性的了解。之后我再转向MFC时，果然发现两者是相通的，虽然有一定的区加，不过有了win32位编程的基础再看MFC
时会发现它比win32位编程要方便了太多。
现在市面上的VC书很多，不过大多是入门书。我以为要精通VC（只是以为，本人自已距精通还远的很）应该多看多写程序，看书只能是入门，会用了而已。我不赞成滥用ActiveX，一来我以为它的性能很成问题，真是又大又慢又不稳定（可能是我有点偏激了吧），二来用了它您的程序今后就要被别人牵着鼻子走了。有次我用了个控件，程序都写了大半了，它给我来个继续使用请支付333美元，我两个多月的工钱，烦不烦人？现在我尽可能用别人写的类源代码(我已收集各类代码3-400MB了)，一样用起来方便，还能边用边学，必要时还能自已改造。
我以为在现代的网络时代，资料到处都有，无论什么先进的技术，今天我不会我只要查到资料，快的学上几天慢的一两个月我也能学会，现在已没有写不出的程序了，写不出是因为你没有耐心写完它。我以为现在的程序员不一定要多么聪明，而更需要他有完成枯燥项目的耐心，找BUG的细心，对于金钱的平常心<br>
（不要为了早日拿到钱而赶进度），最后最重要是有顾全大局，团队协作的精神。
最后，王靖朋友的经历与我实在是有点相似，算是同病相伶吧，真心祝您早日实现自已的人生目标！学习VC是一项费时费力的艰苦学习过程。为了真正用好VC，你
不得不先从OOP开始学起，也许浏览一本纯理论的书要更有意思。 你将从另外的角度考察OO思想。接下来学习C++，学习WindowsAPI
学习MFC，剖析MFC，扩充MFC，创造自己的类库（不要企图写一个 和MFC同重量级的类库）。如果能够精通Microsoft
C编译器的各种 参数，你就可以开始研究微软CC++语言编译器的进化历史（结合 各种背景知识）。
掌握了编程的思想，征服VC只是时间问题。</font></p>
<p><font face="Tahoma">学习VC是接受微软技术体系的过程。所需要学习的不仅仅是C++，MFC。
需要学习所有微软的技术，包括Windows编程，Win32系统（实际上
Win32系统实现了很多我们在屏幕上能看到的东西，最起码NT的内核 并不大），COM（深入研究它，理解对象是如何跨越进程边界的，最终
能够自如地在Exe中实现自己定义的接口才算到家了。不过这多少有些 不太必要。），DCOM，ctiveX，Windows DNA...
如果你想成为大拿，学吧，没完没了。最起码，使用VC，你甚至于可以
开发自己的操作系统（当然与MFC没有一点关系）。</font></p>

]]></description><guid>http://mcs.szu.edu.cn/Article/1217</guid><trackback:ping>http://mcs.szu.edu.cn/Article/1217/trackback</trackback:ping><comments>http://mcs.szu.edu.cn/Article/1217#comment</comments><wfw:commentRss>http://mcs.szu.edu.cn/Article/1217/commentRss</wfw:commentRss></item> <item><link>http://mcs.szu.edu.cn/Article/1216</link><title><![CDATA[文件管理系统]]></title><author>shichengxi</author><category>编程艺术</category><pubDate>Wed, 10 Jan 2007 21:06:02  +0800</pubDate><description><![CDATA[<p align="center"></p>
<p align="center"><font face="Courier New" size=
"4"><strong>文件管理系统</strong></font></p>
<p align="center"></p>
<p><font face="Courier New" size=
"2">运用java.io包下的API进行windows下的文件管理，包括文件及文件夹删除、文件及文件夹属性察看、文件及文件夹拷贝、文件及文件夹创建。</font></p>
<p><font face="Courier New" size=
"2">小地快做完了，可是在copyFile的时候总是出错，请大家看看小第的代码，多提意见，谢啦</font></p>
<p><font face="Courier New" size="2">qq:305821203&nbsp;
mail:xiaohai_34@163.com</font></p>
<p><font face="Courier New" size="2">import java.io.*;<br>
import java.util.ArrayList;<br>
class FileSystem{<br>
public static void main(String[] args) throws IOException{<br>
System.out.println("************1.Look File Data&nbsp;
***********");<br>
System.out.println("************2.Create
File&nbsp;&nbsp;&nbsp;&nbsp; ***********");<br>
System.out.println("************3.Delete
File&nbsp;&nbsp;&nbsp;&nbsp; ***********");<br>
System.out.println("************4.Copy
file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ***********");<br>
System.out.print("Please give me number:");<br>
BufferedReader miannum=new BufferedReader(new
InputStreamReader(System.in));<br>
switch(miannum.readLine().charAt(0)){<br>
case '1':<br>
new LookFile();break;<br>
case '2':<br>
new CreateFile();break;<br>
case '3':<br>
new DelFile();break;<br>
case '4':<br>
new CopyFile();break;<br>
default:System.out.println("Err Menu Number");<br>
}<br>
}<br>
}</font></p>
<p><font face="Courier New" size="2">&nbsp;</font></p>
<p><font face="Courier New" size="2">class CreateFile{<br>
private String filename;<br>
private String filepath;<br>
CreateFile() throws IOException{<br>
System.out.print("Please give me a File Path:");<br>
BufferedReader NFpath=new BufferedReader(new
InputStreamReader(System.in));<br>
filepath=NFpath.readLine();<br>
System.out.print("Please give me a new File Name:");<br>
BufferedReader NFname=new BufferedReader(new
InputStreamReader(System.in));<br>
filename=NFname.readLine();</font></p>
<p><font face="Courier New" size=
"2">if(!CheckFileExist(filepath,filename))<br>
System.out.println("See You!!");<br>
else<br>
Create(filepath,filename,CheckFile(filename));<br>
}</font></p>
<p><font face="Courier New" size="2">private void Create(String
filepath,String filename,String type) throws IOException{<br>
boolean b=false;<br>
File f=new File(filepath+filename);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
(type.equals("file")){<br>
b=f.createNewFile();<br>
}<br>
else if(type.equals("folder")){<br>
b=f.mkdir();<br>
}<br>
if(b)<br>
System.out.println("Create file successful!");<br>
else<br>
System.out.println("Create file Error!");<br>
}</font></p>
<p><font face="Courier New" size="2">private boolean
CheckFileExist(String name,String path){<br>
File f=new File(name+path);<br>
if (f.exists()){<br>
System.out.println("File Name already exist,please delete
first");<br>
return false;<br>
}<br>
else{<br>
return true;<br>
}<br>
}<br>
private String CheckFile(String filename){<br>
if (filename.indexOf(".")==-1){<br>
return "folder";<br>
}else{<br>
return "file";<br>
}<br>
}<br>
}</font></p>
<p><font face="Courier New" size="2">&nbsp;</font></p>
<p><font face="Courier New" size="2">class LookFile{<br>
private String filepath;<br>
LookFile() throws IOException{<br>
String type;<br>
System.out.print("Please give me a File Path or File Name:");<br>
BufferedReader NFname=new BufferedReader(new
InputStreamReader(System.in));<br>
filepath=NFname.readLine();<br>
if ((type=CheckFile(filepath)).equals("false")){<br>
System.out.println("FilePath or FileName is not exists");<br>
}else<br>
Look(filepath,type);<br>
}<br>
private void Look(String filepath,String type){<br>
File[] f={null};<br>
if (type.equals("file")){<br>
&nbsp;f[0]=new File(filepath);<br>
}else if(type.equals("folder")){<br>
&nbsp;f=new File(filepath).listFiles();<br>
}<br>
PrinFileData(f);<br>
}<br>
private void PrinFileData(File[] f){<br>
String type="";<br>
System.out.println("File Name\t\t\t"+"Type\t");<br>
for(int i=0;i&lt;f.length;i++){<br>
if(f[i].isFile()){<br>
type="This is File";<br>
}else if(f[i].isDirectory()){<br>
type="This is Folder";<br>
}<br>
System.out.println(f[i].getName()+"\t\t\t"+type+"\t");<br>
}<br>
}<br>
private String CheckFile(String filename){<br>
File f=new File(filename);<br>
if(!(f).exists()){<br>
return "false";<br>
}else if(filename.indexOf(".")==-1)<br>
return "folder";<br>
else<br>
return "file";<br>
}<br>
}</font></p>
<p><font face="Courier New" size="2">&nbsp;</font></p>
<p><font face="Courier New" size="2">class DelFile{<br>
private String type;<br>
private String filename;<br>
DelFile() throws IOException{<br>
System.out.print("Please give me a FileName or FolderName:");<br>
BufferedReader NFname=new BufferedReader(new
InputStreamReader(System.in));<br>
filename=NFname.readLine();<br>
if ((type=CheckFile(filename)).equals("false")){<br>
System.out.println("FilePath or FileName is not exists");<br>
}else<br>
Delete(filename,type);<br>
}</font></p>
<p><font face="Courier New" size="2">ArrayList allfilename=new
ArrayList();<br>
private void Delete(String filename,String type)throws
IOException{<br>
File FN=new File(filename);<br>
if(FN.isFile()){<br>
allfilename.add(FN);<br>
return;<br>
}<br>
if(FN.isDirectory()){<br>
File[] tem=FN.listFiles();<br>
GetFolderFileName(tem);<br>
allfilename.add(new File(filename));<br>
}<br>
Object[] allfile=allfilename.toArray();<br>
for(int i=0;i&lt;allfile.length;i++){<br>
((File)allfile[i]).delete();<br>
}<br>
}</font></p>
<p><font face="Courier New" size="2">private void
GetFolderFileName(File[] foldername){<br>
for(int i=0;i&lt;foldername.length;i++){<br>
if(foldername[i].isDirectory()){<br>
this.GetFolderFileName(foldername[i].listFiles());<br>
}<br>
allfilename.add(foldername[i]);<br>
}<br>
}<br>
private String CheckFile(String filename){<br>
File f=new File(filename);<br>
if(!f.exists()){<br>
return "false";<br>
}else
if((f.isDirectory()==true)&amp;&amp;((f.listFiles()).length&gt;0)){<br>
return "folder and have file";<br>
}else
if((f.isDirectory()==true)&amp;&amp;((f.listFiles()).length==0)){<br>
return "folder and no file";<br>
}else{<br>
return "file";<br>
}<br>
}<br>
}</font></p>
<p><font face="Courier New" size="2">&nbsp;</font></p>
<p><font face="Courier New" size="2">class CopyFile{<br>
private String basefile;<br>
private String newfilepath;<br>
private String newfilename;<br>
private String type;<br>
CopyFile()throws IOException{<br>
System.out.print("Please give me a Base File name and path:");<br>
BufferedReader basepath=new BufferedReader(new
InputStreamReader(System.in));<br>
basefile=basepath.readLine();<br>
System.out.print("Please give me a new File Parent path:");<br>
BufferedReader topath=new BufferedReader(new
InputStreamReader(System.in));<br>
newfilepath=topath.readLine();<br>
System.out.print("Please give me a new File name:");<br>
BufferedReader toname=new BufferedReader(new
InputStreamReader(System.in));<br>
newfilename=toname.readLine();</font></p>
<p><font face="Courier New" size=
"2">type=CheckFile(basefile,newfilepath,newfilename);<br>
if(type.equals("false")){<br>
System.out.println("System Exit Bye-Bye");<br>
}else{<br>
Copy(basefile,newfilepath,newfilename,type);<br>
}<br>
}<br>
private void Copy(String bf,String nfp,String nfn,String
type)throws IOException{<br>
if(type.equals("file")){<br>
CopytoFile(bf,nfp,nfn);<br>
}<br>
if(type.equals("folder")){<br>
CopytoFolder(bf,nfp,nfn);<br>
}<br>
}<br>
private void CopytoFolder(String bf,String nfp,String nfn)throws
IOException{<br>
File basefilefolder=new File(bf);<br>
File newfilefolder=new File(nfp);<br>
CreateDirectory(basefilefolder,newfilefolder,nfn);<br>
CreateAndCopyFile(basefilefolder,new File(nfp+"\\"+nfn));<br>
}</font></p>
<p><font face="Courier New" size="2">File[] baseallfile=null;<br>
File[] newallfile=null;<br>
private void CreateAndCopyFile(File bf,File nfp)throws
IOException{<br>
this.baseallfile=bf.listFiles();<br>
this.newallfile=nfp.listFiles();<br>
for(int i=0;i&lt;baseallfile.length;i++){<br>
if(baseallfile[i].isDirectory()){<br>
CreateAndCopyFile(baseallfile[i],newallfile[i]);<br>
}else if(baseallfile[i].isFile()){<br>
CopytoFile(baseallfile[i].toString(),newallfile[i].getParent(),newallfile[i].getName());<br>
}<br>
}<br>
}<br>
private void CreateDirectory(File bf,File nfp,String nfn){<br>
File[] alldirectory=bf.listFiles();<br>
File newfilefolder2=new File(nfp+"\\"+nfn);<br>
newfilefolder2.mkdir();<br>
for(int i=0;i&lt;alldirectory.length;i++){<br>
if(alldirectory[i].isDirectory()){<br>
CreateDirectory(alldirectory[i],newfilefolder2,alldirectory[i].getName());<br>
}<br>
}<br>
}<br>
private void CopytoFile(String bf,String nfp,String nfn)throws
IOException{<br>
String tem;<br>
String str="";<br>
BufferedReader in=new BufferedReader(new FileReader(bf));<br>
PrintWriter out=new PrintWriter(new BufferedWriter(new
FileWriter(nfp+"\\"+nfn)));<br>
while((tem=in.readLine())!=null){<br>
str+=tem+"\n";<br>
}<br>
in=new BufferedReader(new StringReader(str));<br>
while((tem=in.readLine())!=null){<br>
out.println(tem);<br>
}<br>
in.close();<br>
out.close();</font></p>
<p><font face="Courier New" size="2">}<br>
private String CheckFile(String bf,String nfp,String nfn){<br>
File basefile=new File(bf);<br>
File newfilepath=new File(nfp);<br>
File newfilename=new File(nfn);<br>
if((!basefile.exists())||(!newfilepath.exists())){<br>
System.out.println("BaseFile or ToFile is not exists!");<br>
return "false";<br>
}else if(!newfilepath.isDirectory()){<br>
System.out.println("New Parent File is not exists!");<br>
return "false";<br>
}else if(basefile.isFile()){<br>
return "file";<br>
}else if(basefile.isDirectory()){<br>
return "folder";<br>
}else{<br>
System.out.println("Unknown Wrong!");<br>
return "false";<br>
}<br>
}<br>
}</font></p>
<p><br>
<font face="Courier New" size="2">&nbsp;</font></p>

]]></description><guid>http://mcs.szu.edu.cn/Article/1216</guid><trackback:ping>http://mcs.szu.edu.cn/Article/1216/trackback</trackback:ping><comments>http://mcs.szu.edu.cn/Article/1216#comment</comments><wfw:commentRss>http://mcs.szu.edu.cn/Article/1216/commentRss</wfw:commentRss></item> <item><link>http://mcs.szu.edu.cn/Article/1214</link><title><![CDATA[各种排序算法小结]]></title><author>shichengxi</author><category>编程艺术</category><pubDate>Wed, 10 Jan 2007 20:43:19  +0800</pubDate><description><![CDATA[&nbsp;
<p class="MsoNormal" style="TEXT-ALIGN: center" align="center">
<span style=
"FONT-SIZE: 15pt; FONT-FAMILY: 宋体; mso-ascii-font-family: ??; mso-hansi-font-family: ??">
<strong>&nbsp;</strong></span></p>
<p class="MsoNormal" style="TEXT-ALIGN: center" align="center">
<span><strong>各种排序算法小结<o:p></o:p></strong></span></p>
<p class="MsoNormal"><span lang="EN-US" style=
"FONT-SIZE: 13.5pt; FONT-FAMILY: ??"><o:p><strong>&nbsp;</strong></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style=
"FONT-SIZE: 13.5pt; FONT-FAMILY: ??"><o:p><strong>&nbsp;</strong></o:p></span></p>
<p class="MsoNormal" style=
"TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<font face="Courier New" size=
"2">排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大，所以排序算法</font></span>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对算法本身的速度要求很高。而一般我们所谓的算法的性能主要是指算法的复杂度，一般用</span><span lang="EN-US">O</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法来表示。在后面我将给出详细的说明。</span></font></font>
<span lang="EN-US"><font face="Courier New"><font size="2"><br>
<span style=
"mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></font></font></span></p>
<p class="MsoNormal" style=
"TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<font face="Courier New" size=
"2">对于排序的算法我想先做一点简单的介绍，也是给这篇文章理一个提纲。我将按照算法的复杂度，从简单到难来分析算法。</font></span>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一部分是简单排序算法，后面你将看到他们的共同点是算法复杂度为</span><span lang=
"EN-US">O(N*N)</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（因为没有使用</span><span lang="EN-US">word,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以无法打出上标和下标）。</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第二部分是高级排序算法，复杂度为</span><span lang=
"EN-US">O(Log2(N))</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这里我们只介绍一种算法。另外还有几种算法因为涉及树与堆的概念，所以这里不于讨论。</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第三部分类似动脑筋。这里的两种算法并不是最好的（甚至有最慢的），但是算法本身比较奇特，值得参考（编程的角度）。同时也可以让我们从另外的角度来认识这个问题。</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第四部分是我送给大家的一个餐后的甜点</span><span lang="EN-US">——</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个基于模板的通用快速排序。由于是模板函数</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以对任何数据类型排序。</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br>
<span style=
"mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
现在，让我们开始吧：</span></font></font> <font face=
"Courier New"><font size="2"><span lang="EN-US"><br>
<br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一、简单排序算法</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
由于程序比较简单，所以没有加什么注释。所有的程序都给出了完整的运行代码，并在我的</span><span lang=
"EN-US">VC</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境下运行通过。因为没有涉及</span><span lang="EN-US">MFC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">WINDOWS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的内容，所以在</span><span lang="EN-US">BORLAND
C++</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的平台上应该也不会有什么问题的。在代码的后面给出了运行过程示意，希望对理解有帮助。</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br>
1.</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">冒泡法：</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
这是最原始，也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡：</span></font></font>
<span lang="EN-US"><font face="Courier New" size=
"2"><br></font></span><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><font face="Courier New" size="2">#include
&lt;iostream.h&gt;<br>
<br>
void BubbleSort(int* pData,int Count)<br>
{<br>
int iTemp;<br>
for(int i=1;i&lt;Count;i++)<br>
{<br>
for(int j=Count-1;j&gt;=i;j--)<br>
{<br>
if(pData[j]&lt;pData[j-1])<br>
{<br>
iTemp = pData[j-1];<br>
pData[j-1] = pData[j];<br>
pData[j] = iTemp;<br></font></span> <span lang="EN-US"><font face=
"Courier New" size="2">}<br></font></span> <span lang="EN-US"
style="FONT-FAMILY: Raavi"><font face="Courier New" size="2">}<br>
}<br>
}<br>
<br>
void main()<br>
{<br>
int data[] = {10,9,8,7,6,5,4};<br>
BubbleSort(data,7);<br>
for (int i=0;i&lt;7;i++)<br>
cout&lt;&lt;data[i]&lt;&lt;" ";<br>
cout&lt;&lt;"\n";<br>
}<br></font></span> <span lang="EN-US"><br></span><font face=
"Courier New"><font size="2"><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">倒序</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最糟情况</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一轮：</span><span lang=
"EN-US">10,9,8,7-&gt;10,9,7,8-&gt;10,7,9,8-&gt;7,10,9,8(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第二轮：</span><span lang=
"EN-US">7,10,9,8-&gt;7,10,8,9-&gt;7,8,10,9(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一轮：</span><span lang=
"EN-US">7,8,10,9-&gt;7,8,9,10(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
循环次数：</span><span lang="EN-US">6</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换次数：</span><span lang="EN-US">6</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其他：</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第一轮：</span><span lang="EN-US">8,10,7,9-&gt;8,10,7,9-&gt;8,7,10,9-&gt;7,8,10,9(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第二轮：</span><span lang=
"EN-US">7,8,10,9-&gt;7,8,10,9-&gt;7,8,10,9(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一轮：</span><span lang=
"EN-US">7,8,10,9-&gt;7,8,9,10(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
循环次数：</span><span lang="EN-US">6</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换次数：</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
上面我们给出了程序段，现在我们分析它：这里，影响我们算法性能的主要部分是循环和交换，显然，次数越多，性能就越差。从上面的程序我们可以看出循环的次数是固定的，为</span><span lang="EN-US">1+2+...+n-1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。写成公式就是</span><span lang="EN-US">1/2*(n-1)*n</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。现在注意，我们给出</span><span lang="EN-US">O</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法的定义：</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
若存在一常量</span><span lang="EN-US">K</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和起点</span><span lang="EN-US">n0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，使当</span><span lang="EN-US">n&gt;=n0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，有</span><span lang="EN-US">f(n)&lt;=K*g(n),</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则</span><span lang="EN-US">f(n)
= O(g(n))</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></font></font></p>
<p class="MsoNormal" style=
"TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><font face=
"Courier New"><font size="2"><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
现在我们来看</span><span lang="EN-US">1/2*(n-1)*n</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，当</span><span lang="EN-US">K=1/2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">n0=1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">g(n)=n*n</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，</span><span lang="EN-US">1/2*(n-1)*n&lt;=1/2*n*n=K*g(n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。所以</span><span lang="EN-US">f(n)
=O(g(n))=O(n*n)</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。所以我们程序循环的复杂度为</span><span lang="EN-US">O(n*n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。再看交换。从程序后面所跟的表可以看到，两种情况的循环相同，交换不同。其实交换本身同数据源的有序程度有极大的关系，当数据处于倒序的情况时，交换次数同循环一样（每次循环判断都会交换），复杂度为</span><span lang="EN-US">O(n*n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。当数据为正序，将不会有交换。复杂度为</span><span lang="EN-US">O(0)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。乱序时处于中间状态。正是由于这样的原因，我们通常都是通过循环次数来对比算法。</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br>
<br>
2.</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换法：</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;</span> <span style=
"mso-spacerun: yes">&nbsp;&nbsp;</span></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换法的程序最清晰简单，每次用当前的元素一一的同其后的元素比较并交换。</span></font></font>
<span lang="EN-US"><font face="Courier New" size=
"2"><br></font></span><font face="Courier New"><font size=
"2"><span lang="EN-US" style="FONT-FAMILY: Raavi">#include
&lt;iostream.h&gt;<br>
void ExchangeSort(int* pData,int Count)<br>
{<br>
int iTemp;<br>
for(int i=0;i&lt;Count-1;i++)<br>
{<br>
for(int j=i+1;j&lt;Count;j++)<br>
{<br>
if(pData[j]&lt;pData[i])<br>
{<br>
iTemp = pData[i];<br>
pData[i] = pData[j];<br>
pData[j] = iTemp;<br>
}<br>
}<br>
}<br>
}<br>
<br>
void main()<br>
{<br>
int data[] = {10,9,8,7,6,5,4};<br>
ExchangeSort(data,7);<br>
for (int i=0;i&lt;7;i++)<br>
cout&lt;&lt;data[i]&lt;&lt;" ";<br>
cout&lt;&lt;"\n";<br>
}<br></span> <span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
倒序</span><span lang="EN-US">(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最糟情况</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一轮：</span><span lang=
"EN-US">10,9,8,7-&gt;9,10,8,7-&gt;8,10,9,7-&gt;7,10,9,8(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第二轮：</span><span lang=
"EN-US">7,10,9,8-&gt;7,9,10,8-&gt;7,8,10,9(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一轮：</span><span lang=
"EN-US">7,8,10,9-&gt;7,8,9,10(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
循环次数：</span><span lang="EN-US">6</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换次数：</span><span lang="EN-US">6</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其他：</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第一轮：</span><span lang="EN-US">8,10,7,9-&gt;8,10,7,9-&gt;7,10,8,9-&gt;7,10,8,9(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第二轮：</span><span lang=
"EN-US">7,10,8,9-&gt;7,8,10,9-&gt;7,8,10,9(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一轮：</span><span lang=
"EN-US">7,8,10,9-&gt;7,8,9,10(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
循环次数：</span><span lang="EN-US">6</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换次数：</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
从运行的表格来看，交换几乎和冒泡一样糟。事实确实如此。循环次数和冒泡一样也是</span><span lang=
"EN-US">1/2*(n-1)*n</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，所以算法的复杂度仍然是</span><span lang="EN-US">O(n*n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。由于我们无法给出所有的情况，所以只能直接告诉大家他们在交换上面也是一样的糟糕（在某些情况下稍好，在某些情况下稍差）。</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br>
3.</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选择法：</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
现在我们终于可以看到一点希望：选择法，这种方法提高了一点性能（某些情况下）这种方法类似我们人为的排序习惯：从数据中选择最小的同第一个值交换，在从剩下的部分中</span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
选择最小的与第二个交换，这样往复下去。</span></font></font> <span lang=
"EN-US"><font face="Courier New" size=
"2"><br></font></span><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><font face="Courier New"><font size=
"2">#include &lt;iostream.h&gt;<br>
void SelectSort(int* pData,int Count)<br>
{<br>
int iTemp;<br>
int iPos;<br>
for(int i=0;i&lt;Count-1;i++)<br>
{<br>
iTemp = pData[i];<br>
iPos = i;<br>
for(int j=i+1;j&lt;Count;j++)<br>
{<br>
if(pData[j]&lt;iTemp)<br>
{<br>
iTemp = pData[j];<br>
iPos = j;<br>
}<br>
}<br>
pData[iPos] = pData[i];<br>
pData[i] = iTemp;<br>
}<o:p></o:p></font></font></span></p>
<p class="MsoNormal"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><o:p><font face="Courier New" size=
"2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal"><font face="Courier New"><font size=
"2"><span lang="EN-US" style="FONT-FAMILY: Raavi">}<br>
<br>
void main()<br>
{<br>
int data[] = {10,9,8,7,6,5,4};<br>
SelectSort(data,7);<br>
for (int i=0;i&lt;7;i++)<br>
cout&lt;&lt;data[i]&lt;&lt;" ";<br>
cout&lt;&lt;"\n";<br>
}<br></span> <span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
倒序</span><span lang="EN-US">(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最糟情况</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一轮：</span><span lang=
"EN-US">10,9,8,7-&gt;(iTemp=9)10,9,8,7-&gt;(iTemp=8)10,9,8,7-&gt;(iTemp=7)7,9,8,10(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第二轮：</span><span lang=
"EN-US">7,9,8,10-&gt;7,9,8,10(iTemp=8)-&gt;(iTemp=8)7,8,9,10(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一轮：</span><span lang=
"EN-US">7,8,9,10-&gt;(iTemp=9)7,8,9,10(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
循环次数：</span><span lang="EN-US">6</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换次数：</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其他：</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第一轮：</span><span lang="EN-US">8,10,7,9-&gt;(iTemp=8)8,10,7,9-&gt;(iTemp=7)8,10,7,9-&gt;(iTemp=7)7,10,8,9(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第二轮：</span><span lang=
"EN-US">7,10,8,9-&gt;(iTemp=8)7,10,8,9-&gt;(iTemp=8)7,8,10,9(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一轮：</span><span lang=
"EN-US">7,8,10,9-&gt;(iTemp=9)7,8,9,10(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
循环次数：</span><span lang="EN-US">6</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换次数：</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
遗憾的是算法需要的循环次数依然是</span><span lang=
"EN-US">1/2*(n-1)*n</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。所以算法复杂度为</span><span lang="EN-US">O(n*n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。我们来看他的交换。由于每次外层循环只产生一次交换（只有一个最小值）。所以</span><span lang="EN-US">f(n)&lt;=n</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以我们有</span><span lang="EN-US">f(n)=O(n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。所以，在数据较乱的时候，可以减少一定的交换次数。</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br>
<br>
4.</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">插入法：</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
插入法较为复杂，它的基本工作原理是抽出牌，在前面的牌中寻找相应的位置插入，然后继续下一张</span></font></font>
<span lang="EN-US"><font face="Courier New" size=
"2"><br></font></span><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><font face="Courier New" size="2">#include
&lt;iostream.h&gt;<br>
void InsertSort(int* pData,int Count)<br>
{<br>
int iTemp;<br>
int iPos;<br>
for(int i=1;i&lt;Count;i++)<br>
{<br>
iTemp = pData[i];<br>
iPos = i-1;<br>
while((iPos&gt;=0) &amp;&amp; (iTemp&lt;pData[iPos]))<br>
{<br>
pData[iPos+1] = pData[iPos];<br>
iPos--;<br>
}<br>
pData[iPos+1] = iTemp;<br>
}<br>
}<br>
<br>
void main()<br>
{<br>
int data[] = {10,9,8,7,6,5,4};<br>
InsertSort(data,7);<br>
for (int i=0;i&lt;7;i++)<br>
cout&lt;&lt;data[i]&lt;&lt;" ";<br>
cout&lt;&lt;"\n";<br>
}<br></font></span> <span lang="EN-US"><br></span><font face=
"Courier New"><font size="2"><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">倒序</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最糟情况</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一轮：</span><span lang=
"EN-US">10,9,8,7-&gt;9,10,8,7(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span><span lang="EN-US">)(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">循环</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第二轮：</span><span lang=
"EN-US">9,10,8,7-&gt;8,9,10,7(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span><span lang="EN-US">)(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">循环</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一轮：</span><span lang=
"EN-US">8,9,10,7-&gt;7,8,9,10(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span><span lang="EN-US">)(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">循环</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
循环次数：</span><span lang="EN-US">6</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换次数：</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其他：</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第一轮：</span><span lang="EN-US">8,10,7,9-&gt;8,10,7,9(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span><span lang="EN-US">)(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">循环</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第二轮：</span><span lang=
"EN-US">8,10,7,9-&gt;7,8,10,9(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span><span lang="EN-US">)(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">循环</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一轮：</span><span lang=
"EN-US">7,8,10,9-&gt;7,8,9,10(</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span><span lang="EN-US">)(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">循环</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font><font face="Courier New"><font size="2"><span lang="EN-US">)<br></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
循环次数：</span><span lang="EN-US">4</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交换次数：</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
上面结尾的行为分析事实上造成了一种假象，让我们认为这种算法是简单算法中最好的，其实不是，因为其循环次数虽然并不固定，我们仍可以使用</span><span lang="EN-US">O</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。从上面的结果可以看出，循环的次数</span><span lang="EN-US">f(n)&lt;=
1/2*n*(n-1)&lt;=1/2*n*n</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。所以其复杂度仍为</span><span lang="EN-US">O(n*n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（这里说明一下，其实如果不是为了展示这些简单排序的不同，交换次数仍然可以这样推导）。现在看交换，从外观上看，交换次数是</span><span lang="EN-US">O(n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（推导类似选择法），但我们每次要进行与内层循环相同次数的</span><span lang="EN-US">‘='</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作。正常的一次交换我们需要三次</span><span lang="EN-US">‘='</span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
而这里显然多了一些，所以我们浪费了时间。</span></font></font> <font face=
"Courier New"><font size="2"><span lang="EN-US"><br>
<br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
最终，我个人认为，在简单排序算法中，选择法是最好的。</span></font></font> <font face=
"Courier New"><font size="2"><span lang="EN-US"><br>
<br>
<br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">二、高级排序算法：</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
高级排序算法中我们将只介绍这一种，同时也是目前我所知道（我看过的资料中）的最快的。它的工作看起来仍然象一个二叉树。首先我们选择一个中间值</span><span lang="EN-US">middle</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序中我们使用数组中间值，然后把比它小的放在左边，大的放在右边（具体的实现是从两边找，找到一对后交换）。然后对两边分别使用这个过程（最容易的方法</span><span lang="EN-US">——</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">递归）。</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br>
1.</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">快速排序：</span></font></font>
<span lang="EN-US"><font face="Courier New" size=
"2"><br></font></span><font face="Courier New"><font size=
"2"><span lang="EN-US" style="FONT-FAMILY: Raavi">#include
&lt;iostream.h&gt;<br>
<br>
void run(int* pData,int left,int right)<br>
{<br>
int i,j;<br>
int middle,iTemp;<br>
i = left;<br>
j = right;<br>
middle = pData[(left+right)/2]; //</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">求中间值</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
do{<br>
while((pData[i]&lt;middle) &amp;&amp;
(i&lt;right))//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">从左扫描大于中值的数</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
i++;<br>
while((pData[j]&gt;middle) &amp;&amp;
(j&gt;left))//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">从右扫描大于中值的数</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
j--;<br>
if(i&lt;=j)//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">找到了一对值</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
{<br>
//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">交换</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
iTemp = pData[i];<br>
pData[i] = pData[j];<br>
pData[j] = iTemp;<br>
i++;<br>
j--;<br>
}<br>
}while(i&lt;=j);//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">如果两边扫描的下标交错，就停止（完成一次）</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
<br>
//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">当左边部分有值</span><span lang="EN-US"
style="FONT-FAMILY: Raavi">(left&lt;j)</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">，递归左半边</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
if(left&lt;j)<br>
run(pData,left,j);<br>
//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">当右边部分有值</span><span lang="EN-US"
style="FONT-FAMILY: Raavi">(right&gt;i)</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">，递归右半边</span></font></font>
<span lang="EN-US" style="FONT-FAMILY: Raavi"><font face=
"Courier New" size="2"><br>
if(right&gt;i)<br>
run(pData,i,right);<br>
}<br>
<br>
void QuickSort(int* pData,int Count)<br>
{<br>
run(pData,0,Count-1);<br>
}<br>
<br>
void main()<br>
{<br>
int data[] = {10,9,8,7,6,5,4};<br>
QuickSort(data,7);<br>
for (int i=0;i&lt;7;i++)<br>
cout&lt;&lt;data[i]&lt;&lt;" ";<br>
cout&lt;&lt;"\n";<br>
}<br></font></span> <span lang="EN-US"><br>
<span style="mso-spacerun: yes"><font face="Courier New" size=
"2">&nbsp;&nbsp;&nbsp;</font></span></span> <span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<font face="Courier New" size=
"2">这里我没有给出行为的分析，因为这个很简单，我们直接来分析算法：首先我们考虑最理想的情况：</font></span></p>
<p class="MsoNormal" style=
"MARGIN-LEFT: 10.5pt; mso-para-margin-left: 1.0gd"><font face=
"Courier New"><font size="2"><span lang=
"EN-US">1.</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数组的大小是</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的幂，这样分下去始终可以被</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">整除。假设为</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">k</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次方，即</span><span lang="EN-US">k=log2(n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
2.</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">每次我们选择的值刚好是中间值，这样，数组才可以被等分。</span></font></font></p>
<p class="MsoNormal" style="TEXT-INDENT: 10.5pt"><font face=
"Courier New"><font size="2"><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
第一层递归，循环</span><span lang="EN-US">n</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次，第二层循环</span><span lang="EN-US">2*(n/2)......</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以共有</span><span lang="EN-US">n+2(n/2)+4(n/4)+...+n*(n/n)
= n+n+n+...+n=k*n=log2(n)*n</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以算法复杂度为</span><span lang="EN-US">O(log2(n)*n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其他的情况只会比这种情况差，最差的情况是每次选择到的</span><span lang="EN-US">middle</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都是最小值或最大值，那么他将变成交换法（由于使用了递归，情况更糟）。但是你认为这种情况发生的几率有多大？你完全不必担心这个问题。实践证明，大多数的情况，快速排序总是最好的。如果你担心这个问题，你可以使用堆排序，这是一种稳定的</span><span lang="EN-US">O(log2(n)*n)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">算法，但是通常情况下速度要慢于快速排序（因为要重组堆）。</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">三、其他排序</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
1.</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">双向冒泡：</span></font></font></p>
<p class="MsoNormal"><span lang="EN-US"><o:p><font face=
"Courier New" size="2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style=
"TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<font face="Courier New" size=
"2">通常的冒泡是单向的，而这里是双向的，也就是说还要进行反向的工作。代码看起来复杂，仔细理一下就明白了，是一个来回震荡的方式。写这段代码的作者认为这样可以在冒泡的基础上减少一些交换。反正我认为这是一段有趣的代码，值得一看。</font></span>
<span lang="EN-US"><font face="Courier New" size=
"2"><br></font></span><font face="Courier New"><font size=
"2"><span lang="EN-US" style="FONT-FAMILY: Raavi">#include
&lt;iostream.h&gt;<br>
void Bubble2Sort(int* pData,int Count)<br>
{<br>
int iTemp;<br>
int left = 1;<br>
int right =Count -1;<br>
int t;<br>
do<br>
{<br>
//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">正向的部分</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
for(int i=right;i&gt;=left;i--)<br>
{<br>
if(pData[i]&lt;pData[i-1])<br>
{<br>
iTemp = pData[i];<br>
pData[i] = pData[i-1];<br>
pData[i-1] = iTemp;<br>
t = i;<br>
}<br>
}<br>
left = t+1;<br>
<br>
//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">反向的部分</span></font></font>
<span lang="EN-US" style="FONT-FAMILY: Raavi"><font face=
"Courier New" size="2"><br>
for(i=left;i&lt;right+1;i++)<br>
{<br>
if(pData[i]&lt;pData[i-1])<br>
{<br>
iTemp = pData[i];<br>
pData[i] = pData[i-1];<br>
pData[i-1] = iTemp;<br>
t = i;<br>
}<br>
}<br>
right = t-1;<br>
}while(left&lt;=right);<br>
}<br>
<br>
void main()<br>
{<br>
int data[] = {10,9,8,7,6,5,4};<br>
Bubble2Sort(data,7);<br>
for (int i=0;i&lt;7;i++)<br>
cout&lt;&lt;data[i]&lt;&lt;" ";<br>
cout&lt;&lt;"\n";<br>
}<br>
<br></font></span> <span lang="EN-US"><br>
<font face="Courier New" size="2">2.SHELL</font></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font face="Courier New"
size="2">排序</font></span> <font face="Courier New"><font size=
"2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
这个排序非常复杂，看了程序就知道了。</span></font></font> <font face=
"Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
首先需要一个递减的步长，这里我们使用的是</span><span lang="EN-US">9</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">5</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（最后的步长必须是</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。工作原理是首先对相隔</span><span lang="EN-US">9-1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个元素的所有内容排序，然后再使用同样的方法对相隔</span><span lang="EN-US">5-1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个元素的排序以次类推。</span></font></font>
<span lang="EN-US"><font face="Courier New" size=
"2"><br></font></span><font face="Courier New"><font size=
"2"><span lang="EN-US" style="FONT-FAMILY: Raavi">#include
&lt;iostream.h&gt;<br>
void ShellSort(int* pData,int Count)<br>
{<br>
int step[4];<br>
step[0] = 9;<br>
step[1] = 5;<br>
step[2] = 3;<br>
step[3] = 1;<br>
<br>
int iTemp;<br>
int k,s,w;<br>
for(int i=0;i&lt;4;i++)<br>
{<br>
k = step[i];<br>
s = -k;<br>
for(int j=k;j&lt;Count;j++)<br>
{<br>
iTemp = pData[j];<br>
w = j-k;//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">求上</span><span lang="EN-US"
style="FONT-FAMILY: Raavi">step</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">个元素的下标</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
if(s ==0)<br>
{<br>
s = -k;<br>
s++;<br>
pData[s] = iTemp;<br>
}<br>
while((iTemp&lt;pData[w]) &amp;&amp; (w&gt;=0) &amp;&amp;
(w&lt;=Count))<br>
{<br>
pData[w+k] = pData[w];<br>
w = w-k;<br>
}<br>
pData[w+k] = iTemp;<br>
}<br>
}<br>
}<br>
<br>
void main()<br>
{<br>
int data[] = {10,9,8,7,6,5,4,3,2,1,-10,-1};<br>
ShellSort(data,12);<br>
for (int i=0;i&lt;12;i++)<br>
cout&lt;&lt;data[i]&lt;&lt;" ";<br>
cout&lt;&lt;"\n";<br>
}<br></span> <span lang="EN-US"><span style=
"mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span> <span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
程序看起来有些头疼。不过也不是很难，把</span><span lang=
"EN-US">s==0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的块去掉就轻松多了，这里是避免使用</span><span lang="EN-US">0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">步长造成程序异常而写的代码。这个代码我认为很值得一看。这个算法的得名是因为其发明者的名字</span><span lang="EN-US">D.L.SHELL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。依照参考资料上的说法：</span><span lang="EN-US">“</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由于复杂的数学原因避免使用</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的幂次步长，它能降低算法效率。</span><span lang="EN-US">”</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另外算法的复杂度为</span><span lang="EN-US">n</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">1.2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次幂。同样因为非常复杂并</span><span lang="EN-US">“</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">超出本书讨论范围</span><span lang="EN-US">”</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的原因（我也不知道过程），我们只有结果了。</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<br>
<br></span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">四、基于模板的通用排序：</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US"><br>
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span></span>
<span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
这个程序我想就没有分析的必要了，大家看一下就可以了。不明白可以在论坛上问。</span></font></font>
<font face="Courier New"><font size="2"><span lang=
"EN-US"><br></span><span lang="EN-US" style=
"FONT-FAMILY: Raavi">MyData.h</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">文件</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
///////////////////////////////////////////////////////<br>
class CMyData<br>
{<br>
public:<br>
CMyData(int Index,char* strData);<br>
CMyData();<br>
virtual ~CMyData();<br>
<br>
int m_iIndex;<br>
int GetDataSize(){ return m_iDataSize; };<br>
const char* GetData(){ return m_strDatamember; };<br>
//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">这里重载了操作符：</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
CMyData&amp; operator =(CMyData &amp;SrcData);<br>
bool operator &lt;(CMyData&amp; data );<br>
bool operator &gt;(CMyData&amp; data );<br>
<br>
private:<br>
char* m_strDatamember;<br>
int m_iDataSize;<br>
};<br>
////////////////////////////////////////////////////////<br>
<br>
MyData.cpp</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">文件</span></font></font>
<span lang="EN-US" style="FONT-FAMILY: Raavi"><font face=
"Courier New"><font size="2"><br>
////////////////////////////////////////////////////////<br>
CMyData::CMyData():<br>
m_iIndex(0),<br>
m_iDataSize(0),<br>
m_strDatamember(NULL)<br>
{<br>
}<br>
<br>
CMyData::~CMyData()<br>
{<br>
if(m_strDatamember != NULL)<br>
delete[] m_strDatamember;<br>
m_strDatamember = NULL;<br>
}<br>
<br>
CMyData::CMyData(int Index,char* strData):<br>
m_iIndex(Index),<br>
m_iDataSize(0),<br>
m_strDatamember(NULL)<br>
{<br>
m_iDataSize = strlen(strData);<br>
m_strDatamember = new char[m_iDataSize+1];<br>
strcpy(m_strDatamember,strData);<br>
}<br>
<br>
CMyData&amp; CMyData::operator =(CMyData &amp;SrcData)<br>
{<br>
m_iIndex = SrcData.m_iIndex;<br>
m_iDataSize = SrcData.GetDataSize();<br>
m_strDatamember = new char[m_iDataSize+1];<br>
strcpy(m_strDatamember,SrcData.GetData());<br>
return *this;<br>
}<br>
<br>
bool CMyData::operator &lt;(CMyData&amp; data )<br>
{<br>
return
m_iIndex&lt;data.m_iIndex;<o:p></o:p></font></font></span></p>
<p class="MsoNormal"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><o:p><font face="Courier New" size=
"2">&nbsp;</font></o:p></span></p>
<p class="MsoNormal"><font face="Courier New"><font size=
"2"><span lang="EN-US" style="FONT-FAMILY: Raavi">}<br>
<br>
bool CMyData::operator &gt;(CMyData&amp; data )<br>
{<br>
return m_iIndex&gt;data.m_iIndex;<br>
}<br>
///////////////////////////////////////////////////////////<br>
<br>
//////////////////////////////////////////////////////////<br>
//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">主程序部分</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
#include &lt;iostream.h&gt;<br>
#include "MyData.h"<br>
<br>
template &lt;class T&gt;<br>
void run(T* pData,int left,int right)<br>
{<br>
int i,j;<br>
T middle,iTemp;<br>
i = left;<br>
j = right;<br>
//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">下面的比较都调用我们重载的操作符函数</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
middle = pData[(left+right)/2]; //</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">求中间值</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
do{<br>
while((pData[i]&lt;middle) &amp;&amp;
(i&lt;right))//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">从左扫描大于中值的数</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
i++;<br>
while((pData[j]&gt;middle) &amp;&amp;
(j&gt;left))//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">从右扫描大于中值的数</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
j--;<br>
if(i&lt;=j)//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">找到了一对值</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
{<br>
//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">交换</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
iTemp = pData[i];<br>
pData[i] = pData[j];<br>
pData[j] = iTemp;<br>
i++;<br>
j--;<br>
}<br>
}while(i&lt;=j);//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">如果两边扫描的下标交错，就停止（完成一次）</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
<br>
//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">当左边部分有值</span><span lang="EN-US"
style="FONT-FAMILY: Raavi">(left&lt;j)</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">，递归左半边</span></font></font>
<font face="Courier New"><font size="2"><span lang="EN-US" style=
"FONT-FAMILY: Raavi"><br>
if(left&lt;j)<br>
run(pData,left,j);<br>
//</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">当右边部分有值</span><span lang="EN-US"
style="FONT-FAMILY: Raavi">(right&gt;i)</span><span style=
"FONT-FAMILY: 宋体; mso-ascii-font-family: Raavi; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Raavi">，递归右半边</span></font></font>
<span lang="EN-US" style="FONT-FAMILY: Raavi"><font face=
"Courier New"><font size="2"><br>
if(right&gt;i)<br>
run(pData,i,right);<br>
}<br>
<br>
template &lt;class T&gt;<br>
void QuickSort(T* pData,int Count)<br>
{<br>
run(pData,0,Count-1);<br>
}<br>
<br>
void main()<br>
{<br>
CMyData data[] = {<br>
CMyData(8,"xulion"),<br>
CMyData(7,"sanzoo"),<br>
CMyData(6,"wangjun"),<br>
CMyData(5,"VCKBASE"),<br>
CMyData(4,"jacky2000"),<br>
CMyData(3,"cwally"),<br>
CMyData(2,"VCUSER"),<br>
CMyData(1,"isdong")<br>
};<br>
QuickSort(data,8);<br>
for (int i=0;i&lt;8;i++)<br>
cout&lt;&lt;data[i].m_iIndex&lt;&lt;"
"&lt;&lt;data[i].GetData()&lt;&lt;"\n";<br>
cout&lt;&lt;"\n";<o:p></o:p></font></font></span></p>

]]></description><guid>http://mcs.szu.edu.cn/Article/1214</guid><trackback:ping>http://mcs.szu.edu.cn/Article/1214/trackback</trackback:ping><comments>http://mcs.szu.edu.cn/Article/1214#comment</comments><wfw:commentRss>http://mcs.szu.edu.cn/Article/1214/commentRss</wfw:commentRss></item> <item><link>http://mcs.szu.edu.cn/Article/1122</link><title><![CDATA[再别康桥]]></title><author>shichengxi</author><category>感受寂静</category><pubDate>Mon, 08 Jan 2007 16:32:27  +0800</pubDate><description><![CDATA[<p><font face="Tahoma" color="#800000" size="3"><font face=
"Comic Sans MS"><font face="Tahoma"><strong><embed src=
"http://blog.szu.edu.cn/Attach/BA473AB9-62D2-4096-8B54-1CE318F4390B"
width="400" height="280" type="application/x-shockwave-flash" play=
"true" loop="true" menu="true"></strong></font></font></font></p>
<p>&nbsp;</p>
<p><strong><font face="Tahoma">&nbsp;</font><font size=
"4">再别康桥</font></strong></p>
<p><font face=
"Tahoma">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<font size="1">徐志摩</font></font></p>
<p>&nbsp;</p>
<p><strong><font face="Arial" size="2">轻轻的我走了，<br>
正如我轻轻的来；<br>
我轻轻的招手，<br>
作别西天的云彩。</font></strong></p>
<p><strong><font face="Arial" size="2">那河畔的金柳<br>
是夕阳中的新娘<br>
波光里的艳影，<br>
在我的心头荡漾。</font></strong></p>
<p><strong><font face="Arial" size="2">软泥上的青荇，<br>
油油的在水底招摇；<br>
在康河的柔波里，<br>
我甘心做一条水草。</font></strong></p>
<p><strong><font face="Arial" size="2">那树荫下的一潭，<br>
不是清泉，是天上虹<br>
揉碎在浮藻间，<br>
沉淀着彩虹似的梦。</font></strong></p>
<p><strong><font face="Arial" size="2">寻梦？撑一支长篙，<br>
向青草更青处漫溯，<br>
满载一船星辉，<br>
在星辉斑斓里放歌！</font></strong></p>
<p><strong><font face="Arial" size="2">但我不能放歌，<br>
悄悄是别离的笙箫；<br>
夏虫也为我沉默，<br>
沉默是今晚的康桥！</font></strong></p>
<p><strong><font face="Arial" size="2">悄悄的我走了，<br>
正如我悄悄的来；<br>
我挥一挥衣袖，<br>
不带走一片云彩。<br></font></strong></p>

]]></description><guid>http://mcs.szu.edu.cn/Article/1122</guid><trackback:ping>http://mcs.szu.edu.cn/Article/1122/trackback</trackback:ping><comments>http://mcs.szu.edu.cn/Article/1122#comment</comments><wfw:commentRss>http://mcs.szu.edu.cn/Article/1122/commentRss</wfw:commentRss></item> <item><link>http://mcs.szu.edu.cn/Article/1121</link><title><![CDATA[Saying Good-bye to Cambridge Again]]></title><author>shichengxi</author><category>感受寂静</category><pubDate>Mon, 08 Jan 2007 16:26:14  +0800</pubDate><description><![CDATA[<p><font color="#800000"><font face="Verdana" size="2">Saying
Good-bye to Cambridge Again<br></font></font></p>
<p><font color="#800000"><font face="Verdana" size="2"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--<font size="1">By
Xu Zhimo</font></font></font></p>
<p align="center"></p>
<p align="center"></p>
<p align="center"></p>
<p><br>
<br>
Very quietly I take my leave<br>
　As quietly as I came here;<br>
　Quietly I wave good-bye<br>
　To the rosy clouds in the western sky.<br></p>
<p>&nbsp;</p>
<p><br>
　The golden willows by the riverside<br>
　Are young brides in the setting sun;<br>
　Their reflections on the shimmering waves<br>
　Always linger in the depth of my heart.<br></p>
<p>&nbsp;</p>
<p><br>
　The floatingheart growing in the sludge<br>
　Sways leisurely under the water;<br>
　In the gentle waves of Cambridge<br>
　I would be a water plant!<br></p>
<p>&nbsp;</p>
<p><br>
　That pool under the shade of elm trees<br>
　Holds not water but the rainbow from the sky;<br>
　Shattered to pieces among the duckweeds<br>
　Is the sediment of a rainbow-like dream?<br></p>
<p>&nbsp;</p>
<p><br>
　To seek a dream? Just to pole a boat 　upstream<br>
　To where the green grass is more verdant;<br>
　Or to have the boat fully loaded with starlight<br>
　And sing aloud in the splendour of starlight.<br></p>
<p>&nbsp;</p>
<p><br>
　But I cannot sing aloud<br>
　Quietness is my farewell music;<br>
　Even summer insects heep silence for me<br>
　Silent is Cambridge tonight!<br></p>
<p>&nbsp;</p>
<p><br>
　Very quietly I take my leave<br>
　As quietly as I came here;<br>
　Gently I flick my sleeves<br>
　Not even a wisp of cloud will I bring away<br></p>
<br>
]]></description><guid>http://mcs.szu.edu.cn/Article/1121</guid><trackback:ping>http://mcs.szu.edu.cn/Article/1121/trackback</trackback:ping><comments>http://mcs.szu.edu.cn/Article/1121#comment</comments><wfw:commentRss>http://mcs.szu.edu.cn/Article/1121/commentRss</wfw:commentRss></item> <item><link>http://mcs.szu.edu.cn/Article/792</link><title><![CDATA[致大海 [普希金]]]></title><author>shichengxi</author><category>感受寂静</category><pubDate>Thu, 04 Jan 2007 08:39:14  +0800</pubDate><description><![CDATA[<p><font color="#993300"><font face="方正舒体"><font size=
"3"><font color="#993300" size="5"><img height="480" alt="" width=
"640" align="texttop" src=
"http://blog.szu.edu.cn/Attach/DB469539-1250-4F00-8C38-0BD981633EE2"></font></font></font></font></p>
<p>&nbsp;<embed id="5829" src=
"http://blog.szu.edu.cn/Attach/924D18CA-092A-40B3-B071-238DA3281C00"
width="500" height="40" type="audio/mp3" autoplay="false"></p>
<p>&nbsp;</p>
<p><font color="#993300"><font face="方正舒体"><font size=
"3"><font color="#993300" size="5">致大海<br></font><br>
<font size="2">普希金</font><br>
<br>
<br>
&nbsp;<img alt="" src=
"/htmledit/editor/images/smiley/msn/angel_smile.gif"><br>
再见吧，自由奔放的大海！<br>
这是你最后一次在我的眼前，&nbsp;<img alt="" src=
"/htmledit/editor/images/smiley/msn/ext_02.gif"><br>
翻滚着蔚蓝色的波浪，<br>
和闪耀着娇<img alt="" src=
"/htmledit/editor/images/smiley/msn/omg_smile.gif">美的容光。<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size="3"><br>
好象是朋友忧郁的怨诉，<br>
好象是他在临别时的呼唤，<br>
我最后<img alt="" src=
"/htmledit/editor/images/smiley/msn/confused_smile.gif">一次在倾听<br>
你悲哀的喧响，你召唤的喧响。<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size="3"><br>
你是我心灵的愿望之所在呀！<br>
我时常沿着你的岸旁，<br>
一个人静悄悄地，茫然地<img alt="" src=
"/htmledit/editor/images/smiley/msn/envelope.gif">徘徊，<br>
还因为那个隐秘地愿望而苦恼心伤！<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size=
"3">我多么<img alt="" src=
"/htmledit/editor/images/smiley/msn/ext_07.gif">热爱你的回音，<br>
热爱你阴沉的声调，你的深渊的音响，<br>
还有那黄昏时分的寂静，<br>
和那反复无常的激情！<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size="3"><br>
渔夫们的温顺的风帆，<br>
靠了你的任性的保护，<br>
在波涛之间<img alt="" src=
"/htmledit/editor/images/smiley/msn/confused_smile.gif">勇敢地飞航；<br>
但当你汹涌起来而无法控制时，<br>
大群地船只就会覆亡。<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size="3"><br>
我曾想永远地离开<br>
你这寂寞和<img alt="" src=
"/htmledit/editor/images/smiley/msn/sad_smile.gif">静止不动地海岸，<br>
怀着狂欢之情祝贺你，<br>
并任我的诗<img alt="" src=
"/htmledit/editor/images/smiley/msn/regular_smile.gif">歌顺着你的波涛奔向远方，<br>
但是我却未能如愿以偿！<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size="3"><br>
你等待着，你召唤着……而我却被束缚住；<br>
我的心灵的挣扎<img alt="" src=
"/htmledit/editor/images/smiley/msn/tounge_smile.gif">完全归于枉然：<br>
我被一种<img alt="" src=
"/htmledit/editor/images/smiley/msn/thumbs_up.gif">强烈的热情所魅惑，<br>
使我留在你的岸旁……<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size="3"><br>
有什么好怜惜呢？现在哪儿<br>
才是我要奔向的无忧无绿虑的路径？<br>
在你的荒漠之中，有一样东西<br>
它曾使我的心灵为之震惊。<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size=
"3">那是一<img alt="" src=
"/htmledit/editor/images/smiley/msn/shades_smile.gif">处峭岩，一座光荣的坟墓……<br>
在那儿，沉浸在寒冷的睡梦中的，<br>
是一些威严的回忆；<br>
拿破仑就在那儿消亡。<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size="3"><br>
在那儿，他长眠在苦难之中。</font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size=
"3">而紧跟他之后，正<img alt="" src=
"/htmledit/editor/images/smiley/msn/ext_06.gif">像风暴的喧响一样，<br>
另一个天才，又飞离我们而去，<br>
他是我们思想上的另一个君主。<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size="3"><br>
为自由之神所悲泣着的歌者消失了，<br>
他把自己的桂冠留在世上。<br>
阴恶的<img alt="" src=
"/htmledit/editor/images/smiley/msn/ext_11.gif">天气喧腾起来吧，激荡起来吧：<br>
哦，大海呀，是他曾经将你歌唱。<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size="3"><br>
你的形象反映在他的身上，<br>
他是用你的精神塑造成长：<br>
正像你一样，他威严、深远而深沉，<br>
他像你一样，什么都<img alt="" src=
"/htmledit/editor/images/smiley/msn/ext_13.gif">不能使他屈服投降。<br>
<br>
<br>
世界空虚了，大海洋呀，<br>
你现在要吧我带到什么地方？<br>
人们的命运到处都是一样：<br>
凡是有着幸福的地方，那儿早就有人在守卫：<br>
或许是开<img alt="" src=
"/htmledit/editor/images/smiley/msn/ext_15.gif">明的贤者，或许是暴虐的君王。<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size="3"><br>
哦，再见吧，大海！<br>
我永不会忘记<img alt="" src=
"/htmledit/editor/images/smiley/msn/ext_20.gif">你庄严的容光，<br>
我将长久地，长久地<br>
倾听你<img alt="" src=
"/htmledit/editor/images/smiley/msn/ext_17.gif">在黄昏时分地轰响。<br></font></font></font></p>
<p><font color="#993300"><font face="方正舒体"><font size="3"><br>
我整个心灵充满了你，<br>
我要把你地峭岩，你地海湾，<br>
你的闪光，你的阴影，还有絮语的波浪，<br>
带进森林，带<img alt="" src=
"/htmledit/editor/images/smiley/msn/ext_12.gif">到那静寂的荒漠之乡。</font></font></font></p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>

]]></description><guid>http://mcs.szu.edu.cn/Article/792</guid><trackback:ping>http://mcs.szu.edu.cn/Article/792/trackback</trackback:ping><comments>http://mcs.szu.edu.cn/Article/792#comment</comments><wfw:commentRss>http://mcs.szu.edu.cn/Article/792/commentRss</wfw:commentRss></item> <item><link>http://mcs.szu.edu.cn/Article/791</link><title><![CDATA[To The Sea [Alexander Pushkin]]]></title><author>shichengxi</author><category>感受寂静</category><pubDate>Thu, 04 Jan 2007 08:35:10  +0800</pubDate><description><![CDATA[<p><img height="480" alt="" width="640" align="texttop" src=
"http://blog.szu.edu.cn/Attach/D305A124-7845-41F7-884D-AEE4F97C44BA"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="center"><font size="5">To The Sea<br></font></p>
<p align="center"><br>
<font size="1">Alexander Pushkin</font><br></p>
<p align="center"><img alt="" src=
"/htmledit/editor/images/smiley/msn/devil_smile.gif"></p>
<p align="center"><br>
Farewell to you, unharnessed Ocean!<br>
No longer will you roll at me<br>
Your azure swells in endless motion<br>
Or gleam in tranquil majesty.<br>
<br>
<br>
A comrade's broken words on leaving,<br>
His hail of parting at the door:<br>
Your chant of luring, chant of grieving<br>
Will murmur in my ears no more.<br>
<br>
<br>
Oh, homeland of my spirit's choosing!<br>
How often on your banks at large<br>
I wandered mute and dimly musing,<br>
Fraught with a sacred, troubling charge!<br>
<br>
<br>
How I would love your deep resounding,<br>
The primal chasm's muffled voice,<br>
How in your vesper calm rejoice,<br>
And in your sudden, reckless bounding!<br>
<br>
<br>
The fisher's lowly canvas slips,<br>
By your capricious favor sheltered,<br>
Undaunted down your breakers' lips:<br>
Yet by your titan romps have weltered<br>
And foundered droves of masted ships.<br>
<br>
<br>
Alas, Fate thwarted me from weighing<br>
My anchor off the cloddish shore,<br>
Exultantly your realm surveying,<br>
And by your drifting ridges laying<br>
My poet's course forevermore.<br>
<br>
<br>
You waited, called... I was in irons,<br>
And vainly did my soul rebel,<br>
Becalmed in those uncouth environs<br>
By passion's overpowering spell.<br>
<br>
<br>
Yet why this sorrow? Toward what fastness<br>
Would now my carefree sails be spread?<br>
To one lone goal in all your vastness<br>
My spirit might have gladly sped.<br>
<br>
<br>
One lonely cliff, the tomb of glory...<br>
There chilling slumber fell upon<br>
The ghost of mankind's proudest story:<br>
There breathed his last Napoleon.<br>
<br>
<br>
There rest for suffering he bartered;<br>
And, gale-borne in his wake, there streams<br>
Another kingly spirit martyred,<br>
Another regent of our dreams.<br>
<br>
<br>
He passed, and left to Freedom mourning,<br>
His laurels to Eternity.<br>
Arise, roar out in stormy warning:<br>
He was your own true bard, oh Sea!<br>
<br>
<br>
His soul was by your spirit haunted,<br>
In your own image was he framed:<br>
Like you immense, profound, undaunted,<br>
Like you nocturnal untamed.<br>
<br>
<br>
Bereft the world... where by your power,<br>
Oh Sea would you now carry me?<br>
Life offers everywhere one dower:<br>
On any glint of bliss there glower<br>
Enlightenment or tyranny.<br>
<br>
<br>
Farewell then, Sea! Henceforth in wonder<br>
Your regal grace will I rever;<br>
Long will your muffled twilit thunder<br>
Reverberate within my ear.<br>
<br>
<br>
To woods and silent wildernesses<br>
Will I translate your potent spells,<br>
Your cliffs, your coves, your shining tresses,<br>
Your shadows and your murmurous swells.<br></p>

]]></description><guid>http://mcs.szu.edu.cn/Article/791</guid><trackback:ping>http://mcs.szu.edu.cn/Article/791/trackback</trackback:ping><comments>http://mcs.szu.edu.cn/Article/791#comment</comments><wfw:commentRss>http://mcs.szu.edu.cn/Article/791/commentRss</wfw:commentRss></item> </channel></rss>        