<?xml version="1.0" encoding="GB2312"?>   
<rdf:RDF 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
xmlns:admin="http://webns.net/mvcb/" 
xmlns:cc="http://web.resource.org/cc/" 
xmlns="http://purl.org/rss/1.0/"> 

<channel rdf:about="http://lanphaday.bokee.com/index.html"> 
<title><![CDATA[恋花蝶的博客]]></title> 
<link>http://lanphaday.bokee.com/index.html</link> 
<description><![CDATA[<script type="text/javascript"><!--
google_ad_client = "pub-5923289565184513";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as_rimg";
google_cpa_choice = "CAAQjMeU_AEaCCfCybguyZX1KLj39IMB";
//--></script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>]]></description> 
<dc:language>zh-cn</dc:language> 
<dc:creator>lanphaday</dc:creator> 
<dc:date>2006-07-01T11:47:27Z</dc:date> 
<admin:generatorAgent rdf:resource="http://blog.bokee.com/" /> 

<items> 
<rdf:Seq>
<rdf:li rdf:resource="http://lanphaday.bokee.com/5323775.html" />
<rdf:li rdf:resource="http://lanphaday.bokee.com/5231234.html" />
<rdf:li rdf:resource="http://lanphaday.bokee.com/5231233.html" />
<rdf:li rdf:resource="http://lanphaday.bokee.com/5145376.html" />
<rdf:li rdf:resource="http://lanphaday.bokee.com/5145363.html" />
<rdf:li rdf:resource="http://lanphaday.bokee.com/5129645.html" />
<rdf:li rdf:resource="http://lanphaday.bokee.com/5110379.html" />
<rdf:li rdf:resource="http://lanphaday.bokee.com/5072965.html" />
<rdf:li rdf:resource="http://lanphaday.bokee.com/5018793.html" />
<rdf:li rdf:resource="http://lanphaday.bokee.com/4969583.html" />
</rdf:Seq> 
</items> 

</channel>


<item rdf:about="http://lanphaday.bokee.com/5323775.html"> 
<title><![CDATA[搬家了，blog搬家了！]]></title> 
<link>http://lanphaday.bokee.com/5323775.html</link> 
<description><![CDATA[<p>鉴于bokee一日比一日烂的服务，现本blog搬到CSDN，网址<a href="http://blog.csdn.net/lanphaday">http://blog.csdn.net/lanphaday</a>，本blog不再更新。CSDN即将推出blog搬家服务，以后会把这里的资料搬过去。</p>]]></description> 
<dc:subject><![CDATA[开发]]></dc:subject> 
<dc:creator><![CDATA[恋花蝶]]></dc:creator> 
<dc:date>2006-07-01T11:47:27Z</dc:date> 
</item> 
<item rdf:about="http://lanphaday.bokee.com/5231234.html"> 
<title><![CDATA[给丫头的迟到的生日快乐！]]></title> 
<link>http://lanphaday.bokee.com/5231234.html</link> 
<description><![CDATA[<p>忘记了昨天是丫头的生日，确切来说，是我没有刻意去记忆。<br />生日，是的，无论是谁的生日，我都不看重的，包括自己的。<br />记得父亲的生日，因为那一天一般是我过完年离家的第二或者第三天。<br />记得三姐的生日，因为那一天是我生日过后的第三天。<br />记得四姐的生日，因为那是六月的第二天。<br />记得女朋友的生日，因为那天是端午节。<br />奶奶、妈妈、大姐、二姐还有很多亲人的生日，我都不记得。<br />即使是姐姐们生日，也大多会忘记打上一个电话。<br />因为，从小到大，生日跟普通日子就没有什么不同，我从来都看重生日。<br />我在乎的，只有春节、端午、中秋、元旦，只有五一、十一。<br />小时候讲成的习惯吧，我没有尝试过生日热闹地过。<br />我生性就觉得生日应该静静地一个人多一个理由安静地度过一晚。</p><p>确实！我不能用自己的标准来要求别人的。<br />我喜欢安静的生日未必是别人喜欢的。<br />何况，我根本就忘记了。<br />作为朋友，没有及时送去祝福是可耻的。<br />只好在这里道一声对不起。<br />只好在这里来一句迟到的生日快乐！</p>]]></description> 
<dc:subject><![CDATA[生活]]></dc:subject> 
<dc:creator><![CDATA[恋花蝶]]></dc:creator> 
<dc:date>2006-06-12T10:44:54Z</dc:date> 
</item> 
<item rdf:about="http://lanphaday.bokee.com/5231233.html"> 
<title><![CDATA[给丫头的迟到的生日快乐！]]></title> 
<link>http://lanphaday.bokee.com/5231233.html</link> 
<description><![CDATA[<p>忘记了昨天是丫头的生日，确切来说，是我没有刻意去记忆。<br />生日，是的，无论是谁的生日，我都不看重的，包括自己的。<br />记得父亲的生日，因为那一天一般是我过完年离家的第二或者第三天。<br />记得三姐的生日，因为那一天是我生日过后的第三天。<br />记得四姐的生日，因为那是六月的第二天。<br />记得女朋友的生日，因为那天是端午节。<br />奶奶、妈妈、大姐、二姐还有很多亲人的生日，我都不记得。<br />即使是姐姐们生日，也大多会忘记打上一个电话。<br />因为，从小到大，生日跟普通日子就没有什么不同，我从来都看重生日。<br />我在乎的，只有春节、端午、中秋、元旦，只有五一、十一。<br />小时候讲成的习惯吧，我没有尝试过生日大摆宴席热闹地过。<br />我生性就觉得生日应该静静地一个人多一个理由安静地度过一晚。</p><p>确实！我不能用自己的标准来要求别人的。<br />我喜欢安静的生日未必是别人喜欢的。<br />何况，我根本就忘记了。<br />作为朋友，没有及时送去祝福是可耻的。<br />只好在这里道一声对不起。<br />只好在这里来一句迟到的生日快乐！</p>]]></description> 
<dc:subject><![CDATA[生活]]></dc:subject> 
<dc:creator><![CDATA[恋花蝶]]></dc:creator> 
<dc:date>2006-06-12T10:44:04Z</dc:date> 
</item> 
<item rdf:about="http://lanphaday.bokee.com/5145376.html"> 
<title><![CDATA[[原创]炒冷饭 《从一道笔试题谈算法优化》全文（下）]]></title> 
<link>http://lanphaday.bokee.com/5145376.html</link> 
<description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">声明：本文最初发表于《电脑编程技巧与维护》2006年第5期，版本所有，如蒙转载，敬请连此声明一起转载，否则追究侵权责任。网上发表于恋花蝶的博客<a href="http://lanphaday.bokee.com/">http://lanphaday.bokee.com</a></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??=""></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??=""></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??=""></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">从一道笔试题谈算法优化</span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="left"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??=""></span></b></p><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??=""><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"></span><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><strong><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">苦想冥思</span><span lang="EN-US" style="mso-bidi-font-weight: bold"></span></font></strong></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">这次优化从</span><span lang="EN-US"><font face="Times New Roman">solution_4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">产生的输出来入手。把</span><span lang="EN-US"><font face="Times New Roman">solution_4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的输出写到文件，查看后发现数组基本无序了。这说明在程序运行一定时间后，频繁的替换几乎将原本有序的结果数组全部换血。结果数组被替换的元素越多，查找最小元素要遍历的范围就越大，当被替换的元素个数接近结果数组的大小时，</span><span lang="EN-US"><font face="Times New Roman">solution_4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">就退化成</span><span lang="EN-US"><font face="Times New Roman">solution_3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">。因为</span><span lang="EN-US"><font face="Times New Roman">solution_4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">很快退化也就直接导致它的效率没有本质上的提高。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">找出了原因，就应该找出一个解决的办法。通过上面的分析，知道</span><span lang="EN-US"><font face="Times New Roman">solution_3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">和</span><span lang="EN-US"><font face="Times New Roman">solution_4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">最消耗时间的是查找最小元素这一操作，将它减少（或去除）才有可能从本质上提高效率。这样思路又回到保持结果数组有序这一条老路上来。在上一节我们谈到保持数组有序的插入算法将带来大量的元素移动，频繁的插入操作将使这一方法在效率上得不偿失。有没有办法让元素移动去掉呢？答案也是有的——那就是使用链表。这时新的问题又来了，链表因为是非随机存取数据结构，插入前寻找位置的算法又是</span><span lang="EN-US"><font face="Times New Roman">O(n)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的。解决新的问题的答案是使用</span><span lang="EN-US"><font face="Times New Roman">AVL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">树，但</span><span lang="EN-US"><font face="Times New Roman">AVL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">树虽然插入和查找都是</span><span lang="EN-US"><font face="Times New Roman">O(logn)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">，可是需要在插入后进行调整保持平衡，这又是一个耗费大量时间的操作。分析到现在，发现我们像进了迷宫，左冲右突都找不到突破口。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">现在请静下来想一想，如果思考结果没有跳出上面这个怪圈，那我不幸地告诉你：你被我误导了。这个故意的误导是要告诫大家：进行算法优化必须时刻保持自己头脑清醒，否则时刻都有可能陷入这样的迷宫当中。现在跳出这个怪圈重新思考，根据前文的分析，可知目标是减少（或去除）查找最小元素的操作次数（或查找时间），途径是让</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">保持有序，难点在于给</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">排序太费时。反过来想一想，是否需要时刻保持</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">有序？答案为否，因为当查找最小元素需要遍历的范围较小时，速度还是很快的，这样就犯不着在每替换一个元素的时候都排序一次，而仅需要在无序元素较多的时候适时地排序即可（即保持查找最小元素要遍历的范围较小）。这个思想有用吗？写代码来测试一下：</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">template&amp;lt; class T, class I &amp;gt;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">void solution_5( T BigArr[], T ResArr[] )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">同</span><span lang="EN-US"><font face="Times New Roman">solution_4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">，略</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">这个后续元素比</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">中最小的元素大，则替换。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>if( BigArr[i] &amp;gt; ResArr[MinElemIdx] )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>{</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>ResArr[MinElemIdx] = BigArr[i];</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>if( MinElemIdx == ZoneBeginIdx )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>--ZoneBeginIdx;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">太多杂乱元素的时候排序</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>if( ZoneBeginIdx &amp;lt; 9400 )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>{</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>std::sort<i>( ResArr, ResArr + RES_ARR_SIZE, std::greater<t />() );</i></font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>ZoneBeginIdx = MinElemIdx = RES_ARR_SIZE - 1;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>continue;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>}</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">同</span><span lang="EN-US"><font face="Times New Roman">solution_4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">，略</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">代码中的</span><span lang="EN-US"><font face="Times New Roman">9400</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">是经过试验得出的最好数值，即在有</span><span lang="EN-US"><font face="Times New Roman">600</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">个元素无序的时候进行一次排序。测试的结果令人惊喜，用时仅</span><span lang="EN-US"><font face="Times New Roman">400</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">毫秒左右，约为</span><span lang="EN-US"><font face="Times New Roman">solution_4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的五分之一，这也证明了上述思想是正确的。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"></span><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><strong><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">殚思极虑</span><span lang="EN-US"></span></font></strong></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">脚步永远向前，在取得</span><span lang="EN-US"><font face="Times New Roman">solution_5</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">这样的成果之后，仍然有必要分析和优化它。对这一看似已经完美的算法进行下一次优化要从哪里着手？这时候要借助于性能剖分工具了，常用的有</span><span lang="EN-US"><font face="Times New Roman">Intel</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的</span><span lang="EN-US"><font face="Times New Roman">VTune</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">以及</span><span lang="EN-US"><font face="Times New Roman">Microsoft Visual C++</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">自带的</span><span lang="EN-US"><font face="Times New Roman">profile</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">等。使用</span><span lang="EN-US"><font face="Times New Roman">MS profile</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">对</span><span lang="EN-US"><font face="Times New Roman">solution_5</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">分析产生的报告如下（略去一些无关数据）：</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&amp;nbsp; </span><span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;</span><span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;</span>Func<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span><span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;</span><span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;</span>Func+Child<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>Hit</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>Time<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp; </span>%<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>Time<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>%<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>Count<span style="mso-spacerun: yes">&amp;nbsp; </span>Function</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman" size="3">---------------------------------------------------------</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>37.718<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp; </span>1.0<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>3835.317<span style="mso-spacerun: yes">&amp;nbsp; </span>99.5<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>1 _main (algo.obj)</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>111.900<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp; </span>2.9<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>3220.082<span style="mso-spacerun: yes">&amp;nbsp; </span>83.6<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>1 solution_5(int * ...</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>0.000<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp; </span>0.0<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>3074.063<span style="mso-spacerun: yes">&amp;nbsp; </span>79.8<span style="mso-spacerun: yes">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>112 _STL::sort(int *,...</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>……</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">可以发现</span><span lang="EN-US"><font face="Times New Roman">sort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">函数的调用用去了将近</span><span lang="EN-US"><font face="Times New Roman">80%</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的时间，这表明</span><span lang="EN-US"><font face="Times New Roman">sort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">函数是问题所在，优化应该从这里着手。但正如前文所说，</span><span lang="EN-US"><font face="Times New Roman">STL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的</span><span lang="EN-US"><font face="Times New Roman">sort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">已经高度优化速度很快了，再对他作优化是极难的；而且</span><span lang="EN-US"><font face="Times New Roman">sort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">函数里又调用了其它</span><span lang="EN-US"><font face="Times New Roman">STL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">内部函数，如蛛丝般牵来绕去，读得懂已经不是一般人可完成的了，优化从何谈起？</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">我们不能左右天气，但我们可以左右心情；我们不能修改</span><span lang="EN-US"><font face="Times New Roman">sort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">函数，但我们可以控制</span><span lang="EN-US"><font face="Times New Roman">sort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的调用。再看看</span><span lang="EN-US"><font face="Times New Roman">solution_5</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">里对</span><span lang="EN-US"><font face="Times New Roman">sort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的调用有没有什么蛛丝马迹可寻：</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>std::sort<i>( ResArr, ResArr + RES_ARR_SIZE, std::greater<t />() );</i></font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">这个调用是把结果数组</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">重新排序一遍。需要把整个</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">完全重新排序吗？答案是需要的，但可以不使用这个方法。因为</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">里的元素绝大部分是有序的（结合上文可知前面</span><span lang="EN-US"><font face="Times New Roman">94%</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的元素都有序），待排序的只是</span><span lang="EN-US"><font face="Times New Roman">6%</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">。只要把这</span><span lang="EN-US"><font face="Times New Roman">600</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">个数据重新排序然后将前后两个有序数组归并为一个有序数组即可（归并算法的时间复杂度为</span><span lang="EN-US"><font face="Times New Roman">O(n+m)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">），将因为排序的数据量较少而大大节约时间。写代码如下：</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">template&amp;lt; class T, class I &amp;gt;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">void solution_6( T BigArr[], T ResArr[] )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">同</span><span lang="EN-US"><font face="Times New Roman">solution_5</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">，略</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">太多杂乱元素的时候排序</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>if( ZoneBeginIdx &amp;lt; 9400 )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>{</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>std::sort<i>( ResArr + 9400, ResArr + RES_ARR_SIZE, std::greater<t />() );</i></font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>std::merge<i, ,i="" i="" />(ResArr, ResArr + 9400, ResArr + 9400, ResArr + RES_ARR_SIZE, BigArr, std::greater<t />() );</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>memcpy( ResArr, BigArr, sizeof(T) * RES_ARR_SIZE );</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">同</span><span lang="EN-US"><font face="Times New Roman">solution_5</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">，略</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">经测试，</span><span lang="EN-US"><font face="Times New Roman">solutio_6</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的运行时间为</span><span lang="EN-US"><font face="Times New Roman">250</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">毫秒左右，比</span><span lang="EN-US"><font face="Times New Roman">solution_5</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">快了将近一半，通过</span><span lang="EN-US"><font face="Times New Roman">profile</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">分析报告计算</span><span lang="EN-US"><font face="Times New Roman">sort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">函数和</span><span lang="EN-US"><font face="Times New Roman">merge</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">函数的占用时间总计约为执行时间的</span><span lang="EN-US"><font face="Times New Roman">19.6%</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">，远小于</span><span lang="EN-US"><font face="Times New Roman">solution_5</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的占用时间。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"></span><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><strong><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">结束语</span><span lang="EN-US"></span></font></strong></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">一番努力之后，终于将一个原来需要近一个小时才能解决的问题用</span><span lang="EN-US"><font face="Times New Roman">250</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">毫秒完成，文章到这里要完结，不过上述算法仍有可优化的余地，这就要读者朋友自己去挖掘了。我希望看到这篇文章的人不仅仅是赞叹算法的奇妙，更希望能够学会算法优化的方法和技巧。对于算法优化的方法，我总结如下（仅供参考及抛砖引玉之用）：</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">不断地否定自己的方法</span><span lang="EN-US"><font face="Times New Roman">[</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">全文</span><span lang="EN-US"><font face="Times New Roman">]</font></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">减少重复计算</span><span lang="EN-US"><font face="Times New Roman">[solution_3]</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">；</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">不要做没要求你做的事</span><span lang="EN-US"><font face="Times New Roman">[solution_3]</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">；</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">深化对需求的理解</span><span lang="EN-US"><font face="Times New Roman">[solution_4]</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">；</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">温故而知新，多重读自己的算法代码</span><span lang="EN-US"><font face="Times New Roman">[solution_4]</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">；</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">从程序的输出（或者中间结果）里找突破</span><span lang="EN-US"><font face="Times New Roman">[solution_5]</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">；</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">时刻保持头脑清醒，常常跳出习惯的框框</span><span lang="EN-US"><font face="Times New Roman">[solution_5]</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">；</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">善于使用工具</span><span lang="EN-US"><font face="Times New Roman">[solution_6]</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">；</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">养成解决一个问题思考多个方案的习惯</span><span lang="EN-US"><font face="Times New Roman">[</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">全文</span><span lang="EN-US"><font face="Times New Roman">]</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">最后要讲的一点就是</span><span lang="EN-US"><font face="Times New Roman">STL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">里提供了一个可以直接完成这一问题的算法——</span><span lang="EN-US"><font face="Times New Roman">nth_element</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">。经测试，</span><span lang="EN-US"><font face="Times New Roman">nth_element</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">在大数组比较小的时候速度比以上算法都要快，但在大数组尺寸为</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">亿的时候所用的时间为</span><span lang="EN-US"><font face="Times New Roman">1.3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">秒左右，是</span><span lang="EN-US"><font face="Times New Roman">solution_6</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">运行时间的</span><span lang="EN-US"><font face="Times New Roman">5</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">倍。原因在于</span><span lang="EN-US"><font face="Times New Roman">nth_elenemt</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的实现方法跟本文介绍的算法大不相同，有兴趣的朋友可以去阅读其源码。建议大家在一般情况下使用</span><span lang="EN-US"><font face="Times New Roman">STL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">的</span><span lang="EN-US"><font face="Times New Roman">nth_element</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">，它在数量为十万级的时候仍有极好的性能。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"></span><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><strong><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">参考资料：</span><span lang="EN-US"></span></font></strong></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>[1] </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">侯捷</span><font face="Times New Roman"> </font><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">《</span><span lang="EN-US"><font face="Times New Roman">STL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">源码剖析》</span><font face="Times New Roman"> </font><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">华中科技大学出版社</span><span lang="EN-US"><font face="Times New Roman"> 2002</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">年</span><span lang="EN-US"><font face="Times New Roman">6</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">月</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>[2] Anany Levitin </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">潘彦</span><span lang="EN-US"><font face="Times New Roman">[</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">译</span><span lang="EN-US"><font face="Times New Roman">] </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">《算法设计与分析基础》</span><font face="Times New Roman"> </font><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">清华大学出版社</span><span lang="EN-US"><font face="Times New Roman"> 2004</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">年</span><span lang="EN-US"><font face="Times New Roman">6</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">月</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>[3] </font></font><a href="http://job.csdn.net/n/20051216/31105.html"><font face="Times New Roman" size="3">http://job.csdn.net/n/20051216/31105.html</font></a></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><strong><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">注：</span><span lang="EN-US"></span></font></strong></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>[1] </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">此题目版权归出题人或者其单位所有</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>[2] </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">本文所有的优化都针对于平均情况，即大数组由随机数构成且无序</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>[3] </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">所有测试均设</span><span lang="EN-US"><font face="Times New Roman">BIG_ARR_SIZE = 1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">亿，</span><span lang="EN-US"><font face="Times New Roman">RES_ARR_SIZE = 1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">万，测试的机器配置为：</span><span lang="EN-US"><font face="Times New Roman">CPU P4EE <chmetcnv w:st="on" unitname="g" sourcevalue="3" hasspace="False" negative="False" numbertype="1" tcsc="0" />3.0G</chmetcnv /> + <chmetcnv w:st="on" unitname="m" sourcevalue="512" hasspace="True" negative="False" numbertype="1" tcsc="0" />512 M</chmetcnv /> memory</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">，</span><span lang="EN-US"><font face="Times New Roman">HyperThreading Enabled</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">，操作系统：</span><span lang="EN-US"><font face="Times New Roman">Windows 2000 pro</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">，编译器：</span><span lang="EN-US"><font face="Times New Roman"> MS VC++ 6.0 + sp6</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">，</span><span lang="EN-US"><font face="Times New Roman">STL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">库：</span><span lang="EN-US"><font face="Times New Roman"> STLport <chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False" />4.6.2</chsdate /></font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">；可从我的博客</span><span lang="EN-US"><a href="http://lanphaday.bokee.com/"><font face="Times New Roman">http://lanphaday.bokee.com</font></a></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">下载本文所有算法源码和测试程序。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>[4] </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " roman??="" new="" ?times="" mso-hansi-font-family:="" roman?;="" times="">如果要求有序，可以通过先找出结果，再对结果排序完成要求</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="left" /></p><p><font face="Times New Roman" size="3">&amp;nbsp;</font></p></p><p><font face="Times New Roman" size="3">&amp;nbsp;</font></p></p><p><font face="Times New Roman" size="3">&amp;nbsp;</font></p></p><p><font face="Times New Roman" size="3">&amp;nbsp;</font></p></span>]]></description> 
<dc:subject><![CDATA[开发]]></dc:subject> 
<dc:creator><![CDATA[恋花蝶]]></dc:creator> 
<dc:date>2006-06-01T00:01:24Z</dc:date> 
</item> 
<item rdf:about="http://lanphaday.bokee.com/5145363.html"> 
<title><![CDATA[[原创]炒冷饭 《从一道笔试题谈算法优化》全文（上）]]></title> 
<link>http://lanphaday.bokee.com/5145363.html</link> 
<description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">声明：本文最初发表于《电脑编程技巧与维护》2006年第5期，版本所有，如蒙转载，敬请连此声明一起转载，否则追究侵权责任。网上发表于恋花蝶的博客<a href="http://lanphaday.bokee.com/">http://lanphaday.bokee.com</a></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??=""></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??=""></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??=""></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">从一道笔试题谈算法优化</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 14pt"></span></b></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt" /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 62.8pt; TEXT-INDENT: -62.8pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??=""></span></font></p><b style="mso-bidi-font-weight: normal"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">引子</span><span lang="EN-US"><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">每年十一月各大</span><span lang="EN-US"><font face="Times New Roman">IT</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">公司都不约而同、争后恐后地到各大高校进行全国巡回招聘。与此同时，网上也开始出现大量笔试面试题；网上流传的题目往往都很精巧，既能让考查基础知识，又在平淡中隐含了广阔的天地供优秀学生驰骋。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">这两天在网上淘到一道笔试题目（注</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">），虽然真假未知，但的确是道好题，题目如下：</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><i style="mso-bidi-font-style: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">从</span><span lang="EN-US"><font face="Times New Roman">10</font></span></i><i style="mso-bidi-font-style: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">亿个浮点数中找出最大的</span><span lang="EN-US"><font face="Times New Roman">1</font></span></i><i style="mso-bidi-font-style: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万个。</span><span lang="EN-US"></span></i></font></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">这是一道似易实难的题目，一般同学最容易中的陷阱就是没有重视这个“亿”字。因为有</span><span lang="EN-US"><font face="Times New Roman">10</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">亿个单精度浮点数元素的数组在</span><span lang="EN-US"><font face="Times New Roman">32</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">位平台上已经达到</span><span lang="EN-US"><font face="Times New Roman">3.7GB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">之巨，在常见计算机平台（如</span><span lang="EN-US"><font face="Times New Roman">Win32</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">）上声明一个这样的数组将导致堆栈溢出。正确的解决方法是分治法，比如每次处理</span><span lang="EN-US"><font face="Times New Roman">100</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万个数，然后再综合起来。不过这不是本文要讨论的主旨，所以本文把上题的</span><span lang="EN-US"><font face="Times New Roman">10</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">亿改为</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">亿，把浮点数改为整数，这样可以直接地完成这个问题，有利于清晰地讨论相关算法的优化（注</span><span lang="EN-US"><font face="Times New Roman">2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">）。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"></span></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">不假思索</span><span lang="EN-US"></span></font></b></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">拿到这道题，马上就会想到的方法是建立一个数组把</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">亿个数装起来，然后用</span><span lang="EN-US"><font face="Times New Roman">for</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">循环遍历这个数组，找出最大的</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万个数来。原因很简单，因为如果要找出最大的那个数，就是这样解决的；而找最大的</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万个数，只是重复</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万遍而已。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">template&amp;lt; class T &amp;gt;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">void solution_1( T BigArr[], T ResArr[] )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>for( int i = 0; i &amp;lt; RES_ARR_SIZE; ++i )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>{</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>int idx = i;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>for( int j = i+1; j &amp;lt; BIG_ARR_SIZE; ++j )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>{</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>if( BigArr[j] &amp;gt; BigArr[idx] )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 4">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>idx = j;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>}</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>ResArr[i] = BigArr[idx];</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>std::swap( BigArr[idx], BigArr[i] );</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><font size="3"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>}</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">设</span><span lang="EN-US"><font face="Times New Roman">BIG_ARR_SIZE </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">＝</span><span lang="EN-US"><font face="Times New Roman"> 1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">亿，</span><span lang="EN-US"><font face="Times New Roman">RES_ARR_SIZE = 1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万，运行以上算法已经超过</span><span lang="EN-US"><font face="Times New Roman">40</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">分钟（注</span><span lang="EN-US"><font face="Times New Roman">3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">），远远超过我们的可接受范围。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"></span></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">稍作思考</span><span lang="EN-US"></span></font></b></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">从上面的代码可以看出跟</span><span lang="EN-US"><font face="Times New Roman">SelectSort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">算法的核心代码是一样的。因为</span><span lang="EN-US"><font face="Times New Roman">SelectSort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">是一个</span><span lang="EN-US"><font face="Times New Roman">O(n^2)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的算法（</span><span lang="EN-US"><font face="Times New Roman">solution_1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的时间复杂度为</span><span lang="EN-US"><font face="Times New Roman">O(n*m)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">，因为</span><span lang="EN-US"><font face="Times New Roman">solution_1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">没有将整个大数组全部排序），而我们又知道排序算法可以优化到</span><span lang="EN-US"><font face="Times New Roman">O(nlogn)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">，那们是否可以从这方面入手使用更快的排序算法如</span><span lang="EN-US"><font face="Times New Roman">MergeSor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">、</span><span lang="EN-US"><font face="Times New Roman">QuickSort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">呢？但这些算法都不具备从大至小选择最大的</span><span lang="EN-US"><font face="Times New Roman">N</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">个数的功能，因此只有将</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">亿个数按从大到小用</span><span lang="EN-US"><font face="Times New Roman">QuickSort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">排序，然后提取最前面的</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万个。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">template&amp;lt; class T, class I &amp;gt;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">void solution_2( T BigArr[], T ResArr[] )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>std::sort<i>( BigArr, BigArr + BIG_ARR_SIZE, std::greater_equal<t />() );</i></font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>memcpy( ResArr, BigArr, sizeof(T) * RES_ARR_SIZE );</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">因为</span><span lang="EN-US"><font face="Times New Roman">STL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">里的</span><span lang="EN-US"><font face="Times New Roman">sort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">算法使用的是</span><span lang="EN-US"><font face="Times New Roman">QuickSort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">，在这里直接拿来用了，是因为不想写一个写一个众人皆知的</span><span lang="EN-US"><font face="Times New Roman">QuickSort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">代码来占篇幅（而且</span><span lang="EN-US"><font face="Times New Roman">STL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的</span><span lang="EN-US"><font face="Times New Roman">sort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">高度优化、速度快）。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">对</span><span lang="EN-US"><font face="Times New Roman">solution_2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">进行测试，运行时间是</span><span lang="EN-US"><font face="Times New Roman">32</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">秒，约为</span><span lang="EN-US"><font face="Times New Roman">solution_1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的</span><span lang="EN-US"><font face="Times New Roman">1.5%</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的时间，已经取得了几何数量级的进展。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"></span></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">深入思考</span><span lang="EN-US"></span></font></b></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">压抑住兴奋回头再仔细看看</span><span lang="EN-US"><font face="Times New Roman">solution_2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">，你将发现一个大问题，那就是在</span><span lang="EN-US"><font face="Times New Roman">solution_2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">里所有的元素都排序了！而事实上只需找出最大的</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万个即可，我们不是做了很多无用功吗？应该怎么样来消除这些无用功？</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">如果你一时没有头绪，那就让我慢慢引导你。首先，发掘一个事实：如果这个大数组本身已经按从大到小有序，那么数组的前</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万个元素就是结果；然后，可以假设这个大数组已经从大到小有序，并将前</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万个元素放到结果数组；再次，事实上这结果数组里放的未必是最大的一万个，因此需要将前</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万个数字后续的元素跟结果数组的最小的元素比较，如果所有后续的元素都比结果数组的最小元素还小，那结果数组就是想要的结果，如果某一后续的元素比结果数组的最小元素大，那就用它替换结果数组里最小的数字；最后，遍历完大数组，得到的结果数组就是想要的结果了。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">template&amp;lt; class T &amp;gt;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">void solution_3( T BigArr[], T ResArr[] )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">取最前面的一万个</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>memcpy( ResArr, BigArr, sizeof(T) * RES_ARR_SIZE );</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">标记是否发生过交换</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>bool bExchanged = true;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">遍历后续的元素</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>for( int i = RES_ARR_SIZE; i &amp;lt; BIG_ARR_SIZE; ++i )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>{</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>int idx;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">如果上一轮发生过交换</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>if( bExchanged )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>{</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">找出</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">中最小的元素</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>int j;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>for( idx = 0, j = 1; j &amp;lt; RES_ARR_SIZE; ++j )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>{</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 4">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>if( ResArr[idx] &amp;gt; ResArr[j] )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 5">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>idx = j;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>}</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>}</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">这个后续元素比</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">中最小的元素大，则替换。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>if( BigArr[i] &amp;gt; ResArr[idx] )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>{</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>bExchanged = true;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>ResArr[idx] = BigArr[i];</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>}</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>else</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>bExchanged = false;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>}</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">上面的代码使用了一个布尔变量</span><span lang="EN-US"><font face="Times New Roman">bExchanged</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">标记是否发生过交换，这是一个前文没有谈到的优化手段——用以标记元素交换的状态，可以大大减少查找</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">中最小元素的次数。也对</span><span lang="EN-US"><font face="Times New Roman">solution_3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">进行测试一下，结果用时</span><span lang="EN-US"><font face="Times New Roman">2.0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">秒左右（不使用</span><span lang="EN-US"><font face="Times New Roman">bExchanged</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">则高达</span><span lang="EN-US"><font face="Times New Roman">32</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">分钟），远小于</span><span lang="EN-US"><font face="Times New Roman">solution_2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的用时。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"></span></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">深思熟虑</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US"></span></b></font></p><p /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">在进入下一步优化之前，分析一下</span><span lang="EN-US"><font face="Times New Roman">solution_3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的成功之处。第一、</span><span lang="EN-US"><font face="Times New Roman">solution_3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的算法只遍历大数组一次，即它是一个</span><span lang="EN-US"><font face="Times New Roman">O(n)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的算法，而</span><span lang="EN-US"><font face="Times New Roman">solution_1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">是</span><span lang="EN-US"><font face="Times New Roman">O(n*m)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的算法，</span><span lang="EN-US"><font face="Times New Roman">solution_2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">是</span><span lang="EN-US"><font face="Times New Roman">O(nlogn)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的算法，可见它在本质上有着天然的优越性；第二、在</span><span lang="EN-US"><font face="Times New Roman">solution_3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">中引入了</span><span lang="EN-US"><font face="Times New Roman">bExchanged</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">这一标志变量，从测试数据可见引入</span><span lang="EN-US"><font face="Times New Roman">bExchanged</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">减少了约</span><span lang="EN-US"><font face="Times New Roman">99.99%</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的时间，这是一个非常大的成功。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">上面这段话绝非仅仅说明了</span><span lang="EN-US"><font face="Times New Roman">solution_3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的优点，更重要的是把</span><span lang="EN-US"><font face="Times New Roman">solution_3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的主要矛盾摆上了桌面——为什么一个</span><span lang="EN-US"><font face="Times New Roman">O(n)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的算法效率会跟</span><span lang="EN-US"><font face="Times New Roman">O(n*m)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的算法差不多（不使用</span><span lang="EN-US"><font face="Times New Roman">bExchanged</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">）？为什么使用了</span><span lang="EN-US"><font face="Times New Roman">bExchanged</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">能够减少</span><span lang="EN-US"><font face="Times New Roman">99.99%</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的时间？带着这两个问题再次审视</span><span lang="EN-US"><font face="Times New Roman">solution_3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的代码，发现</span><span lang="EN-US"><font face="Times New Roman">bExchanged</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的引入实际上减少了如下代码段的执行次数：</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">for( idx = 0, j = 1; j &amp;lt; RES_ARR_SIZE; ++j )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>if( ResArr[idx] &amp;gt; ResArr[j] )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>idx = j;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">上面的代码段即是查找</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">中最小元素的算法，分析它可知这是一个</span><span lang="EN-US"><font face="Times New Roman">O(n)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的算法，到此时就水落石出了！原来虽然</span><span lang="EN-US"><font face="Times New Roman">solution_3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">是一个</span><span lang="EN-US"><font face="Times New Roman">O(n)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的算法，但因为内部使用的查找最小元素的算法也是</span><span lang="EN-US"><font face="Times New Roman">O(n)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的算法，所以就退化为</span><span lang="EN-US"><font face="Times New Roman">O(n*m)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的算法了。难怪不使用</span><span lang="EN-US"><font face="Times New Roman">bExchanged</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">使用的时间跟</span><span lang="EN-US"><font face="Times New Roman">solution_1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">差不多；这也从反面证明了</span><span lang="EN-US"><font face="Times New Roman">solution_3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">被上面的这一代码段导致性能退化。使用了</span><span lang="EN-US"><font face="Times New Roman">bExchanged</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">之后因为减少了很多查找最小元素的代码段执行，所以能够节省</span><span lang="EN-US"><font face="Times New Roman">99.99%</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的时间！</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">至此可知元凶就是查找最小元素的代码段，但查找最小元素是必不可少的操作，在这个两难的情况下该怎么去优化呢？答案就是保持结果数组（即</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">）有序，那样的话最小的元素总是最后一个，从而省去查找最小元素的时间，解决上面的问题。但这也引入了一个新的问题：保持数组有序的插入算法的时间复杂度是</span><span lang="EN-US"><font face="Times New Roman">O(n)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的，虽然在这个问题里插入的数次比例较小，但因为基数太大（</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">亿），这一开销仍然会令本方案得不偿失。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">难道就没有办法了吗？记得小学解应用题时老师教导过我们如果解题没有思路，那就多读几遍题目。再次审题，注意到题目并没有要求找到的最大的</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万个数要有序（注</span><span lang="EN-US"><font face="Times New Roman">4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">），这意味着可以通过如下算法来解决：</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 63.0pt"><span lang="EN-US" style="mso-fareast-font-family: " times="" new="" roman??=""><span style="mso-list: Ignore"><font face="Times New Roman"><font size="3">1)</font><span style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal" times="" new="" roman??="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span></font></span></span><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">将</span><span lang="EN-US"><font face="Times New Roman">BigArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的前</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">万个元素复制到</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">并用</span><span lang="EN-US"><font face="Times New Roman">QuickSort</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">使</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">有序，并定义变量</span><span lang="EN-US"><font face="Times New Roman">MinElemIdx</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">保存最小元素的索引，并定义变量</span><span lang="EN-US"><font face="Times New Roman">ZoneBeginIdx</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">保存可能发生交换的区域的最小索引；</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 63.0pt"><span lang="EN-US" style="mso-fareast-font-family: " times="" new="" roman??=""><span style="mso-list: Ignore"><font face="Times New Roman"><font size="3">2)</font><span style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal" times="" new="" roman??="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span></font></span></span><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">遍历</span><span lang="EN-US"><font face="Times New Roman">BigArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">其它的元素，如果某一元素比</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">最小元素小，则将</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">中</span><span lang="EN-US"><font face="Times New Roman">MinElemIdx</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">指向的元素替换，如果</span><span lang="EN-US"><font face="Times New Roman">ZoneBeginIdx == MinElemIdx</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">则扩展</span><span lang="EN-US"><font face="Times New Roman">ZoneBeginIdx</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">；</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 63.0pt"><span lang="EN-US" style="mso-fareast-font-family: " times="" new="" roman??=""><span style="mso-list: Ignore"><font face="Times New Roman"><font size="3">3)</font><span style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal" times="" new="" roman??="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span></font></span></span><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">重新在</span><span lang="EN-US"><font face="Times New Roman">ZoneBeginIdx</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">至</span><span lang="EN-US"><font face="Times New Roman">RES_ARR_SIZE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">元素段中寻找最小元素，并用</span><span lang="EN-US"><font face="Times New Roman">MinElemIdx</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">保存其它索引；</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 63.0pt"><span lang="EN-US" style="mso-fareast-font-family: " times="" new="" roman??=""><span style="mso-list: Ignore"><font face="Times New Roman"><font size="3">4)</font><span style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal" times="" new="" roman??="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span></font></span></span><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">重复</span><span lang="EN-US"><font face="Times New Roman">2)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">直至遍历完所有</span><span lang="EN-US"><font face="Times New Roman">BigArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">的元素。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??=""><font size="3">依上算法，写代码如下：</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">template&amp;lt; class T, class I &amp;gt;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">void solution_4( T BigArr[], T ResArr[] )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">取最前面的一万个</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>memcpy( ResArr, BigArr, sizeof(T) * RES_ARR_SIZE );</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">排序</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>std::sort<i>( ResArr, ResArr + RES_ARR_SIZE, std::greater_equal<t />() );</i></font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">最小元素索引</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>unsigned int MinElemIdx = RES_ARR_SIZE - 1;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">可能产生交换的区域的最小索引</span><span lang="EN-US"><font face="Times New Roman"> </font></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>unsigned int ZoneBeginIdx = MinElemIdx;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">遍历后续的元素</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>for( unsigned int i = RES_ARR_SIZE; i &amp;lt; BIG_ARR_SIZE; ++i )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>{<span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span></font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">这个后续元素比</span><span lang="EN-US"><font face="Times New Roman">ResArr</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">中最小的元素大，则替换。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>if( BigArr[i] &amp;gt; ResArr[MinElemIdx] )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>{</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>ResArr[MinElemIdx] = BigArr[i];</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>if( MinElemIdx == ZoneBeginIdx )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 4">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>--ZoneBeginIdx;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">查找最小元素</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>unsigned int idx = ZoneBeginIdx;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>unsigned int j = idx + 1;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>for( ; j &amp;lt; RES_ARR_SIZE; ++j )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>{</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 4">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>if( ResArr[idx] &amp;gt; ResArr[j] )</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 5">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>idx = j;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>}</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>MinElemIdx = idx;</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 2">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>}</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </span>}</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">经过测试，同样情况下</span><span lang="EN-US"><font face="Times New Roman">solution_4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">用时约</span><span lang="EN-US"><font face="Times New Roman">1.8</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">秒，较</span><span lang="EN-US"><font face="Times New Roman">solution_3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: " mso-hansi-font-family:="" times="" roman?;="" ?times="" new="" roman??="">效率略高，总算不负一番努力。</span></font><i><i><i /></i></i></p><p /><p><font face="Times New Roman" size="3">&amp;nbsp;</font></p><p /><p><font face="Times New Roman" size="3">&amp;nbsp;</font></p><p /><p><font face="Times New Roman" size="3">&amp;nbsp;</font></p><p /><p><font face="Times New Roman" size="3">&amp;nbsp;</font></p></span></font></b>]]></description> 
<dc:subject><![CDATA[开发]]></dc:subject> 
<dc:creator><![CDATA[恋花蝶]]></dc:creator> 
<dc:date>2006-05-31T23:58:52Z</dc:date> 
</item> 
<item rdf:about="http://lanphaday.bokee.com/5129645.html"> 
<title><![CDATA[修身齐家治国平天下　 读《战国策》和《编程卓越之道》有感]]></title> 
<link>http://lanphaday.bokee.com/5129645.html</link> 
<description><![CDATA[<p align="left">本文由恋花蝶最初发表在<a href="http://lanphaday.bokee.com/">http://lanphaday.bokee.com</a>，并保留所有相关权利，欢迎转载（任意形式请勿删改），但请保存这一段声明，谢谢。</p><p align="center" /><p align="center">修身齐家治国平天下<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 读《战国策》和《编程卓越之道》有感</p><p>&amp;nbsp;前几天买了好几本书，其中有《战国策》和《编程卓越之道 第一卷 深入理解计算机》。今天谈谈读了它们之后的一些感想。<br />&amp;nbsp;久远的封建王朝遗留给我们的学习目标就是学而优则仕，终身理想就是治国平天下，最起码也得齐家。这种停留在家农耕时代的思想至今仍然是法力无穷，终其原因就是农工商的地位太低。当然，这篇文章不是谈政治的，所以这方面的问题就点到即止。治国平天下到现代赋予了新的意义，就是在某一领域成为顶尖人物，比如搞化学的拿个诺贝尔奖、搞计算机的拿个图灵奖之类。不过这样的人物自然是像会打失传已久的“如来神掌”武学奇材一样百年一遇，离我们太过遥远，不过仍然记妨碍我们不倦追求，这正是三千年封建文化留给我们的好处之一。封建文化给我们的另一个好处就是科举，有利于人材的选拨（不打算讨论其公正性及适应性）。科举带来的最大好处就是让广大人民群众认识到只要“修身”，那是有机会“齐家治国平天下”的。<br />&amp;nbsp;《战国策》是一部史书，读史的好处大多，我就不多引援名家之言了。对于《战》我更乐于把它看作是一本治国平天下的教程，比如改名为《Learning Kingcraft by Example》相信可以在外国卖得不错。《战》一书还没有看完四分之一，但已经初窥门道，正如前言，他主要讲述治国平天下的技术，但对于修身这个齐家治国平天下的基础之术却鲜有所言。其实一直以来，修身是最基础却最不被重视，诸子百家也鲜有所言。不过后来元明清时期终于渐渐重视起来，出现了《颜氏家训》、《朱子家训》等书籍。但直到现在，修身仍然难以在一个人的人生规划甚至是职业规划中占有一席之地，大家乐于追求和计划升职加薪，却对胜任更高职位提出的能力要求视若无睹，深以为熬足十年八年，丑媳妇终会熬成婆。是以网上都说程序员三十岁三十五岁该如何如何，却没有人谈程序员二十岁二十五岁时该如何如何。这就是对修身之术的不重视。<br />&amp;nbsp;这方面，国外的很多同行就做得更好一些，但不是说国内没有这样的人。《编程卓越之道》（英文名：Write Great Code）四卷本就是讲述修身之术的好书。我现在手上的是第一卷，中文版现在也只出了第一卷。先不说这本书的内容，从英文名和中文名就可以看出国人的浮躁和好大喜功。平平实实的英文名译成中文的时候非扯上“道”这一深奥难懂的概念不可，译成《如何编写卓越代码》或者《让代码从平凡到卓越》不可么？还有一本叫《程序员修练之道》的名字译得比这个更恶心，译个题目都喜欢故弄玄虚。讲了题目，再谈谈这本书吧，这本书是好书，翻译的质量尚可（可能读中译本比较多，接受各种词汇的能力加强了），但排版等细节方面仍有不足，比如多处把2^n印成了2n，但瑕不掩瑜，作者Randall Hyde（《The art of assembly Language》一书的作者）对计算机系统的深入理解仍然跃然纸上，从数值在计算机中的表示到二进制算术和位运算，从浮点数表示到字符表示及字符串组织，从内存的组织与访问到CPU体系结构，从指令集到输入输出细细给你道明其中的优缺和瓶颈。作者并没有教你优化的方法，只是告诉你哪里会陷阱。记得《C++编程规范》里有一个条目是避免代码劣化，感觉这本书全书都是在印证这一个说法——如果你没有能力优化，起码要保持它没有被劣化。参加过一些code review，有时候会看到一两段代码写得比较耗CPU和内存，比如在局面重置的时候全部生成新的对象或者在条件判断的时候把不太可能发生的情况放在前面，有同事指出的时候，听到的往往是：“嗯，这里是有问题，因为刚开始的时候代码不成熟，所以没有做优化，我们打算在正式版（下一版）优化它。”这时候我比较想说的是：“你不是在做优化，只是把劣化的代码改正过来而已。”同样来自《C++编程规范》，有一句话说得很好：优化应该放在代码稳定成熟了再做，防止劣化却要时刻进行（不完全记得了）。在这里，我这样说不是说我写的代码就没有劣化，相反地，我觉得自己写的代码因为“设计模式”思想的缺失和项目经验的缺乏，往往是小处有精巧大看结构差，我个人觉得这是更加严重的劣化了，因为这个劣化消耗的不再是CPU和内存，直接就是自己和同事的精力和生命了。参加工作快要一年了，越来越认识到这一点，记得年前职前培训的时候很想分到实际的项目组去，现在我却又希望能再给我半年时间什么都不用做，让我好好地读一下书，打好基础开拓思维。作为以编写卓越代码为目标的程序员，精读《编程卓越之道》四卷本的意义决不止于加固基础那么简单，个人来讲，我更大的感触就是它让我认知到基础的重要性，即修身的重要性。从小学到大学，我都没有读过重点学校，胸无大志的我耍几分小聪明轻松过关。正是这当年引以为傲的小聪明，让我不重视基础，以为生活和工作也会像考试一次逃不出自己的聪明脑袋。甚至在象棋这一关上吃了基础不扎实的亏仍然执迷少悟（故意把不写成少，:-)）。后来毕业了，进了网易，身边高手如云，想奋起直追却始知自己下盘不稳根基不牢。比这更大的障碍是自己害怕离开自己熟悉的语言和平台不能让自己发挥自己的小聪明，让人识破自己是只纸糊的“老虎”。工作了很久之后，才有胆量卸下包袱，慢慢进行自我修身之路。《编程卓越之道》是一本很好的“修”技术之“身”的书，我打算四卷都读下去。<br />&amp;nbsp;中国人的理想是治国平天下，外国人也说不想当将军的兵不是好兵，我不是圣贤级别的，难以免俗也期望在自己熟悉的领域里有所建树。读《战国策》和《编程卓越之道》两本书给我的感想就是：做大事要有做大事的策略，但天下大事必作于细（侯捷语），没有坚实的基础知识，是没有掌控大事的能力的。古人总结得好：一屋不扫，何以扫天下？所以，我要放好心态，一步一步来。</