﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-天使的白骨-文章分类-algorithm and structure</title><link>http://www.cppblog.com/TianShiDeBaiGu/category/17203.html</link><description>给我一个EMACS，我不需要操作系统</description><language>zh-cn</language><lastBuildDate>Sat, 10 Nov 2012 21:28:14 GMT</lastBuildDate><pubDate>Sat, 10 Nov 2012 21:28:14 GMT</pubDate><ttl>60</ttl><item><title>常用算法.排序算法:冒泡排序，快速排序，归并排序，插入排序，堆排序，统计排序。字符串转换</title><link>http://www.cppblog.com/TianShiDeBaiGu/articles/149716.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Wed, 29 Jun 2011 02:34:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/articles/149716.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/149716.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/articles/149716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/149716.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/149716.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体;"><span style="display: inline;" id="Codehighlighter1_65_151_Open_Text"><span style="color: #000000;">常用排序算法：冒泡排序，快速排序，归并排序，插入排序，堆排序，统计排序。<br /><div><span style="font-family: 宋体;"><span style="display: inline;" id="Codehighlighter1_65_151_Open_Text"><span style="color: #000000;">冒泡排序伪代码：<br /></span></span></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,n)<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i;&nbsp;j&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;;&nbsp;j</span><span style="color: #000000; ">--</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(x[i]&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;x[j])&nbsp;&nbsp; swap(i,j)</span></div></div>插入排序伪代码：<br /></span></span></span><span style="font-family: 宋体;"><span style="display: inline;" id="Codehighlighter1_65_151_Open_Text"><span style="color: #000000;"><font color="#008000"></font><br /></span></span></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,n)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i;&nbsp;j&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;x[j</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;x[j];&nbsp;j</span><span style="color: #000000; ">--</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(j</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,j)</span></div><span style="font-family: 宋体;"><span style="display: inline;" id="Codehighlighter1_65_151_Open_Text"><span style="color: #000000;">原理是，想象自己在摸牌，牌放在桌子上，我们每拿起一张，先将这张牌放在最右边，然后与手里的牌从右到左的比较，一次一次的向前交换，直到到达合适的位置。<br />实用C++代码：<br /></span></span></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">insert_sort.cpp</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">template<div style="display: inline-block; "></div></span><span class="Apple-style-span" style="color: #5e5e5e; font-family: Verdana, Helvetica, Arial; line-height: 18px; "><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;&nbsp;RandomAccessIterator</span><span style="color: #000000; ">&gt;</span></span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;insert_sort(RandomAccessIterator&nbsp;first,&nbsp;&nbsp;RandomAccessIterator&nbsp;last)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(first&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last)&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(RandomAccessIterator&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i) //拿起桌子上的牌，从first+1开始拿是因为只有一张的话，本身就有序了。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linear_insert(first,&nbsp;i,&nbsp;value_type(first)); &nbsp; &nbsp; &nbsp; //给拿起来的牌排序，从右往左插入。<br />}<br /><br />template<div style="display: inline-block; "></div></span><span class="Apple-style-span" style="color: #5e5e5e; font-family: Verdana, Helvetica, Arial; line-height: 18px; "><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;&nbsp;RandomAccessIterator</span><span style="color: #000000; ">&gt;</span></span><span style="color: #000000; "><br />inline&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;linear_insert(RandomAccessIterator&nbsp;first,&nbsp;&nbsp;RandomAccessIterator&nbsp;last,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">last;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(value&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//最右边的值比最左边的值还要大，那就把最右边的牌放在最前面，因此其他的牌依次向后（右边）移动。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::copy_backward(first,&nbsp;last,&nbsp;first</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">); &nbsp;//</span>其他的牌依次向后（右边）移动，将第一个位置留给新牌。<br /><span style="color: #000000; ">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;value; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//把新的牌放在第一个位置。<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unguarded_linear_insert(last,&nbsp;value); &nbsp; &nbsp; &nbsp;//依次</span>线性的<span style="color: #000000; ">从右往左比较，让新牌自己去找个合适的位置。<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />template<div style="display: inline-block; "></div></span><span class="Apple-style-span" style="color: #5e5e5e; font-family: Verdana, Helvetica, Arial; line-height: 18px; "><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;&nbsp;RandomAccessIterator</span><span style="color: #000000; ">&gt;</span></span><span style="color: #000000; "><br />inline&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;unguarded_linear_insert(RandomAccessIterator&nbsp;last,&nbsp;T&nbsp;value)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;RandomAccessIterator&nbsp;next&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;last;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">next;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(value&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">next){ //一个一个的来比较，如果新牌比较大，就和老的牌换一下位置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">last&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">next;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;next;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">next;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">last&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;//Or&nbsp;we&nbsp;can&nbsp;make&nbsp;it&nbsp;like&nbsp;this:<br />&nbsp;&nbsp;&nbsp;&nbsp;RandomAccessIterator&nbsp;position&nbsp;=&nbsp;find(last,&nbsp;first,&nbsp;less_than(*last));<br />&nbsp;&nbsp;&nbsp;&nbsp;swap(value,&nbsp;copy(position,&nbsp;last,position+1)&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />}</span></div><br /><span style="font-family: 宋体;"><span style="display: inline;" id="Codehighlighter1_65_151_Open_Text"><span style="color: #000000;"><font color="#0000ff"><class randomaccessiterator=""><class t=""  randomaccessiterator,=""><class t=""  randomaccessiterator,=""><br /><font color="#000000">快速排序伪代码：<br /></font></class></class></class></font></span></span></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;qsort(lower,&nbsp;uper)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;lower&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;uper&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;middle&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;lower<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[lower</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;uper]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;x[i]&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;x[l]&nbsp;&nbsp;&nbsp;then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(</span><span style="color: #000000; ">++</span><span style="color: #000000; ">middle,&nbsp;i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(lower,&nbsp;middle)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qsort(lower,&nbsp;middle</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qsort(middle</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;uper)</span></div><span style="font-family: 宋体;"><span style="display: inline;" id="Codehighlighter1_65_151_Open_Text"><span style="color: #000000;"><font color="#0000ff"><class randomaccessiterator=""><class t=""  randomaccessiterator,=""><class t=""  randomaccessiterator,=""><font color="#000000"><br /><br />实际代码，之后重新定制了这个算法，使用双边快排：<br /></font></class></class></class></font></span></span></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">bits</span><span style="color: #000000; ">/</span><span style="color: #000000; ">stl_iterator_base_types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">algorithm</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;&nbsp;RandomAccessIterator</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;qsort(RandomAccessIterator&nbsp;first,&nbsp;RandomAccessIterator&nbsp;last){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(&nbsp;first&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last&nbsp;)&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;typename&nbsp;std::iterator_traits</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">RandomAccessIterator</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::value_type&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;*(last&nbsp;-&nbsp;1);&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;RandomAccessIterator&nbsp;left&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;<br />&nbsp;&nbsp;&nbsp;&nbsp;RandomAccessIterator&nbsp;right&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;last;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">left&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;tmp)&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">left;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">right&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;tmp)&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(right&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;left&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::swap(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">left,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">right);</span><span style="color: #008000; ">//</span><span style="color: #008000; ">iter_swap(leftm,&nbsp;right);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">left;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">std::swap(*first,*right);&nbsp;这个交换可以换得比较稳定的时间复杂度，但是有些情况下，效率没有去掉此行高</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;qsort(first,&nbsp;left);<br />&nbsp;&nbsp;&nbsp;&nbsp;qsort(right</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;last);<br />}<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;x[</span><span style="color: #000000; ">10</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,</span><span style="color: #000000; ">6</span><span style="color: #000000; ">,</span><span style="color: #000000; ">8</span><span style="color: #000000; ">,</span><span style="color: #000000; ">4</span><span style="color: #000000; ">,</span><span style="color: #000000; ">9</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,</span><span style="color: #000000; ">7</span><span style="color: #000000; ">,</span><span style="color: #000000; ">6</span><span style="color: #000000; ">,</span><span style="color: #000000; ">33</span><span style="color: #000000; ">};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">9999999</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::sort(x,x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">10</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">use&nbsp;time&nbsp;&nbsp;2.272s<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">qsort(x,x+10);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">use&nbsp;time&nbsp;4.072s</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;std::for_each(x,&nbsp;x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,&nbsp;[](</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;tmp){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">tmp</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div><br /><span style="font-family: 宋体"><span style="display: inline" id="Codehighlighter1_65_151_Open_Text"><span style="color: #000000;"><font color="#0000ff"><class randomaccessiterator=""><class t=""  randomaccessiterator,=""><class t=""  randomaccessiterator,=""><div style="font-family: Tahoma; color: black; font-size: 11px"></div></class></class></class></font>//程序的执行时间在linux下的测试方式是time a.out<br /><br /><br /></span></span></span><span style="font-family: 宋体; "><font color="#ee82ee"><span style="color: #0000ff; "><font color="#ff0000">一个题，写一个函数将第一个参数所有的小写字母转换成大写字母，结果放在第二个参数里面。函数原型为void transfer_up(const char *first, char *second);</font></span></font></span><span style="font-family: 宋体; "><span style="color: #0000ff; "><br />&nbsp;</span></span><font color="#deb887"><font color="#a9a9a9"><span style="font-family: 宋体; "><span style="color: #0000ff; ">输入限制为a-zA-Z</span>&nbsp;</span></font><br /><font color="#000000"><span style="font-family: 宋体; "><span style="color: #0000ff; "><font color="#a9a9a9">//单个字符小写转换为大写</font>&nbsp;<br /></span></span></font></font><div style="padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; width: 1628.75px; word-break: break-all; "><span style="color: #0000ff; ">char</span>&nbsp;&nbsp;toupper(&nbsp;<span style="color: #0000ff; ">char</span>&nbsp;&nbsp;c){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;&nbsp;c&nbsp;&nbsp;&amp;&nbsp;&nbsp;&nbsp;0x5F&nbsp;;<br />}</div><span style="font-family: 宋体; "><span style="color: #008080; "></span><font color="#a9a9a9">//单个字符大写转换为小写</font>&nbsp;<br /><span style="color: #008080; "></span><span style="color: #0000ff; "></span></span><div style="padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; width: 1628.75px; word-break: break-all; "><span style="color: #0000ff; ">char</span>&nbsp;&nbsp;tolower(&nbsp;<span style="color: #0000ff; ">char</span>&nbsp;&nbsp;c)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c&nbsp;|&nbsp;0x60也行,但不太好,因为0x60会改变结果的第7位值,根据题目意思,改变第6位值为1,而其它位保持不变就够了。</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;&nbsp;c&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;0x20&nbsp;;<br />}</div><span style="font-family: 宋体; "><font color="#000000"><span style="color: #0000ff; "></span></font><span id="Codehighlighter1_65_151_Open_Text" style="display: inline; "><font color="#000000"></font><br />完全方案<br /></span></span><div style="padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; width: 1628.75px; word-break: break-all; "><span style="color: #0000ff; ">void</span>&nbsp;transfer_up(<span style="color: #0000ff; ">const</span>&nbsp;<span style="color: #0000ff; ">char</span>&nbsp;*first,&nbsp;<span style="color: #0000ff; ">char</span>&nbsp;*second){<br />&nbsp; &nbsp; &nbsp; &nbsp; if(*first == '\0' || first == (char*)0 ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;second = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">do</span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">if</span>(*first &gt;&nbsp;'a'&nbsp;&amp;&amp;&nbsp;*first&nbsp;&lt;&nbsp;'z')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*second++&nbsp;=&nbsp;(*first)&nbsp;&amp;0x5F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">或者static&nbsp;int&nbsp;delta&nbsp;=&nbsp;'A'&nbsp;-&nbsp;'a';&nbsp;*second++&nbsp;=&nbsp;*first&nbsp;+&nbsp;delta;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span style="color: #0000ff; ">while</span>(*（++first） !=&nbsp;'\0');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*second&nbsp;=&nbsp;'\0';<br />}</div><span style="font-family: 宋体; ">那么大写转小写也是同样的道理了。不过是同0x20求与。<br /></span><span style="font-family: 宋体"><span style="display: inline"><span style="color: #000000;"><br /></span></span></span><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/149716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2011-06-29 10:34 <a href="http://www.cppblog.com/TianShiDeBaiGu/articles/149716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>算法技巧，环串的4个旋转算法对比：</title><link>http://www.cppblog.com/TianShiDeBaiGu/articles/149632.html</link><dc:creator>何清龙</dc:creator><author>何清龙</author><pubDate>Tue, 28 Jun 2011 01:03:00 GMT</pubDate><guid>http://www.cppblog.com/TianShiDeBaiGu/articles/149632.html</guid><wfw:comment>http://www.cppblog.com/TianShiDeBaiGu/comments/149632.html</wfw:comment><comments>http://www.cppblog.com/TianShiDeBaiGu/articles/149632.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/TianShiDeBaiGu/comments/commentRss/149632.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/TianShiDeBaiGu/services/trackbacks/149632.html</trackback:ping><description><![CDATA[<span style="color: #993366;">问题</span>：将一个n元一维向量向左旋转i个位置。例如，当n=8,且i =3时，向量abcdefgh旋转为defghabc.简单的代码使用一个n元向量在n步内完成该工作。<br />
你能否仅仅使用数十个额外字节的存储空间，在此正比于n的时间内完成向量的旋转？<br /><font color="#008000"><br />
方案1：</font>首先将n的前i个数组复制到一个临时数组中，然后将剩余下的n-i个元素向左移动i个位置，最后将最初的i个元素存储在临时数组中的内容复制到n中余下的位置。<br />
<span style="color: #ff99cc;">这个方案产生过大的存储空间消耗。</span><br /><br /><font color="#008000">方案2：</font>定义一个函数将n向左旋转一个位置，然后调用该函数i次。<br />
<span style="color: #ff99cc;">该方法产生过多的时间消耗</span><br /><br /><font color="#008000">方案3：</font>将问题看作是交换向量AB的两段，得到向量BA。这里A代表n中的前i个元素.假设A比B短，将B分为Bl和Br,使得Br具有和A相同的长度,交换A，Br，得到BrBlA，A放到了他需要的最终位置。<br />
接下来将BrBl看作整体,采用同样的形式，交换Br到Bl后面，递归解决
<br />
<span style="color: #ff99cc;">该方案非常优雅，效率也足够高。不过需要作者具有较好的编码能力</span><br /><font color="#008000"><br />
方案4：</font>将问题看作是把数组AB转换成BA,同时假定我们拥有一个函数可以将数组中的特定部分的元素求逆。<br />
<span style="color: red;">从AB开始-------&gt;对A求逆得到ArB</span><br /> 
abc | defgh-----------&gt; cba | defgh <br /><br />
<span style="color: red;">对B求逆--------&gt;ArBr</span><br />
cba | defgh----------&gt;cba | hgfed<br /><br />
<span style="color: red;">对该式子整体求逆------------&gt;(ArBr)r==BA</span><br />
cba | hgfed----------&gt;cbahgfed -----------&gt; cbah | gfed---求逆---&gt;defghabc        (这就是我们要的结果)<br /><br />
<span style="color: red;">最终得到BA.</span><br />
defghabc<br /><br />
于是我们得到了如下代码;<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">reverse(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">逆转A</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />reverse(i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,n</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">逆转B</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />reverse(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,n</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">逆转ArBr</span><span style="color: #008000; ">*/</span></div>
<span style="color: #ff99cc;">时间和空间上都很高效，代码简短优雅，不易出错（强壮性高）</span><img src ="http://www.cppblog.com/TianShiDeBaiGu/aggbug/149632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/TianShiDeBaiGu/" target="_blank">何清龙</a> 2011-06-28 09:03 <a href="http://www.cppblog.com/TianShiDeBaiGu/articles/149632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>