﻿<?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++博客-DoogooFeng Learn to C++</title><link>http://www.cppblog.com/doogoofeng/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 23:04:16 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 23:04:16 GMT</pubDate><ttl>60</ttl><item><title>小实验，四种排序算法性能比较 </title><link>http://www.cppblog.com/doogoofeng/archive/2012/10/03/192689.html</link><dc:creator>doogoofeng</dc:creator><author>doogoofeng</author><pubDate>Tue, 02 Oct 2012 18:06:00 GMT</pubDate><guid>http://www.cppblog.com/doogoofeng/archive/2012/10/03/192689.html</guid><wfw:comment>http://www.cppblog.com/doogoofeng/comments/192689.html</wfw:comment><comments>http://www.cppblog.com/doogoofeng/archive/2012/10/03/192689.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/doogoofeng/comments/commentRss/192689.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/doogoofeng/services/trackbacks/192689.html</trackback:ping><description><![CDATA[<div>原文地址<a href="http://www.cppblog.com/newcnzz/archive/2012/10/02/192624.html">http://www.cppblog.com/newcnzz/archive/2012/10/02/192624.html</a><br />
<div id="article_content" class="article_content" sizset="0" sizcache="0">
<p>闲着没事，做个小小的测试，测试一下冒泡，选择，插入和快速四种排序对同一个含有1000000个元素的数组排序所用的时间，做个比较。</p>
<p>四种排序的代码如下：</p>
<p>冒泡排序：</p>
<div class="dp-highlighter bg_cpp">
<div class="bar">
<div class="tools"><strong>[cpp]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">?</font></u></a></div></div>
<ol class="dp-cpp"><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">typename</span><span>&nbsp;T&gt;&nbsp;&nbsp;</span></li><li><span></span><span class="keyword">void</span><span>&nbsp;bubble_sort(T&nbsp;a[],&nbsp;</span><span class="datatypes">int</span><span>&nbsp;num){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(num&nbsp;==0&nbsp;||&nbsp;num&nbsp;==&nbsp;1)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">bool</span><span>&nbsp;changed&nbsp;=&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">do</span><span>{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span>&nbsp;i=0;&nbsp;i&lt;num-1;&nbsp;i++){&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(a[i]&nbsp;&lt;&nbsp;a[i+1]){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(a[i],&nbsp;a[i+1]);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changed&nbsp;=&nbsp;</span><span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">while</span><span>(changed);&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre style="display: none" class="cpp" name="code">template &lt;typename T&gt;
void bubble_sort(T a[], int num){
	if(num ==0 || num == 1)
		return ;
	bool changed = false;
	do{
		for(int i=0; i&lt;num-1; i++){
			if(a[i] &lt; a[i+1]){
				swap(a[i], a[i+1]);
				changed = true;
			}
		}
		
	}while(changed);
}</pre>
<p>&nbsp;</p>
<p>选择排序：</p>
<div class="dp-highlighter bg_cpp">
<div class="bar">
<div class="tools"><strong>[cpp]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">?</font></u></a></div></div>
<ol class="dp-cpp"><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">typename</span><span>&nbsp;T&gt;&nbsp;&nbsp;</span></li><li><span></span><span class="keyword">void</span><span>&nbsp;select_sort(T&nbsp;a[],&nbsp;</span><span class="datatypes">int</span><span>&nbsp;num){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;min;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;locate;</span><span class="comment">//最小值位置 </span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span>&nbsp;i=0;&nbsp;i&lt;num-1;&nbsp;i++){&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min&nbsp;=&nbsp;a[i];&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//找最小值 </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span>&nbsp;j=i+1;&nbsp;j&lt;num;&nbsp;j++){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(a[j]&nbsp;&lt;&nbsp;min){&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locate&nbsp;=&nbsp;j;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(a[i],&nbsp;a[locate]);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre style="display: none" class="cpp" name="code">template &lt;typename T&gt;
void select_sort(T a[], int num){
	T min;
	int locate;//最小值位置
	for(int i=0; i&lt;num-1; i++){
		min = a[i];
		//找最小值
		for(int j=i+1; j&lt;num; j++){
			if(a[j] &lt; min){
				locate = j;
			}
		}
		swap(a[i], a[locate]);
	}
}</pre>
<p>&nbsp;</p>
<p>插入排序：</p>
<div class="dp-highlighter bg_cpp">
<div class="bar">
<div class="tools"><strong>[cpp]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">?</font></u></a></div></div>
<ol class="dp-cpp"><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">typename</span><span>&nbsp;T&gt;&nbsp;&nbsp;</span></li><li><span></span><span class="keyword">void</span><span>&nbsp;insert_sort(T&nbsp;a[],&nbsp;</span><span class="datatypes">int</span><span>&nbsp;num){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;j;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;temp;</span><span class="comment">//暂存无序区待插入元素 </span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span>&nbsp;i=1;&nbsp;i&lt;num;&nbsp;++i){&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;i;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;a[i];&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//待插入元素与有序区元素一一比较 </span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(j&nbsp;&gt;&nbsp;0&nbsp;&amp;&amp;&nbsp;temp&nbsp;&lt;&nbsp;a[j-1]</span><span class="comment">/*如果小于有序区被比较元素*/</span><span>){&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//则将有序区元素后移 </span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[j]&nbsp;=&nbsp;a[j-1];&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//将被比较元素前移一位 </span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--j;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//将待插入元素插入相应位置 </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[j]&nbsp;=&nbsp;temp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li></ol></div><pre style="display: none" class="cpp" name="code">template &lt;typename T&gt;
void insert_sort(T a[], int num){
	int j;
	int temp;//暂存无序区待插入元素
	for(int i=1; i&lt;num; ++i){
		j = i;
		temp = a[i];
		//待插入元素与有序区元素一一比较
		while(j &gt; 0 &amp;&amp; temp &lt; a[j-1]/*如果小于有序区被比较元素*/){
			//则将有序区元素后移
			a[j] = a[j-1];
			//将被比较元素前移一位
			--j;
		}
		//将待插入元素插入相应位置
		a[j] = temp;
	}
}</pre>
<p>&nbsp;</p>
<p>快速排序：</p>
<div class="dp-highlighter bg_cpp">
<div class="bar">
<div class="tools"><strong>[cpp]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">?</font></u></a></div></div>
<ol class="dp-cpp"><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">typename</span><span>&nbsp;T&gt;&nbsp;&nbsp;</span></li><li><span></span><span class="keyword">void</span><span>&nbsp;quick_sort(T&nbsp;a[],&nbsp;</span><span class="datatypes">int</span><span>&nbsp;num)&nbsp;&nbsp;</span></span></li><li class="alt"><span>{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//如果一个元素，不用排 </span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(num&nbsp;==1)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//如果只有两个元素没必要分界 </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(num&nbsp;==&nbsp;2){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(a[1]&nbsp;&lt;&nbsp;a[0])&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(a[1],&nbsp;a[0]);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//取中间元素为界，希望可以将两部分尽量分的均匀一些 </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;swap(a[num/2],&nbsp;a[0]);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;bound&nbsp;=&nbsp;a[0];&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//声明左右两个指针变量 </span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;T*&nbsp;L&nbsp;=&nbsp;a+1;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;T*&nbsp;R&nbsp;=&nbsp;a+num-1;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//作比较，不合适的交换，直至一趟排序完成 </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(L&nbsp;&lt;&nbsp;R){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(L&nbsp;&lt;&nbsp;R&nbsp;&amp;&amp;&nbsp;*L&nbsp;&lt;&nbsp;bound)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++L;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(R&nbsp;&gt;=&nbsp;L&nbsp;&amp;&amp;&nbsp;*R&nbsp;&gt;&nbsp;bound)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--R;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(L&nbsp;&lt;&nbsp;R)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(*L,&nbsp;*R);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(*R&nbsp;&lt;&nbsp;bound)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(*R,&nbsp;*a);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//递归排序两个分开的子序列 </span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;quick_sort(a,&nbsp;R-a);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;quick_sort(R+1,&nbsp;num-1-(R-a));&nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre style="display: none" class="cpp" name="code">template &lt;typename T&gt;
void quick_sort(T a[], int num)
{
	//如果一个元素，不用排
	if(num ==1)
		return ;
	//如果只有两个元素没必要分界
	if(num == 2){
		if(a[1] &lt; a[0])
			swap(a[1], a[0]);
		return ;
	}
	//取中间元素为界，希望可以将两部分尽量分的均匀一些
	swap(a[num/2], a[0]);
	T bound = a[0];
	//声明左右两个指针变量
	T* L = a+1;
	T* R = a+num-1;
	//作比较，不合适的交换，直至一趟排序完成
	while(L &lt; R){
		while(L &lt; R &amp;&amp; *L &lt; bound)
			++L;
		while(R &gt;= L &amp;&amp; *R &gt; bound)
			--R;
		if(L &lt; R)
			swap(*L, *R);
	}
	if(*R &lt; bound)
		swap(*R, *a);
	//递归排序两个分开的子序列
	quick_sort(a, R-a);
	quick_sort(R+1, num-1-(R-a));
}</pre>
<p>&nbsp;</p>
<p>测试程序如下：</p>
<div class="dp-highlighter bg_cpp">
<div class="bar">
<div class="tools"><strong>[cpp]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/ro_wsy/article/details/7690965#"><u><font color="#800080">?</font></u></a></div></div>
<ol class="dp-cpp"><li class="alt"><span class="preprocessor">#include&nbsp;&lt;iostream&gt; </span><span>&nbsp;&nbsp;</span></li><li><span></span><span class="keyword">using</span><span>&nbsp;</span><span class="keyword">namespace</span><span>&nbsp;std;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="preprocessor">#include&nbsp;&lt;ctime&gt; </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span></span><span class="datatypes">int</span><span>&nbsp;main()&nbsp;&nbsp;</span></span></li><li><span>{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">const</span><span>&nbsp;</span><span class="datatypes">int</span><span>&nbsp;N=100000;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;a[N];&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(1){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span>&nbsp;i=0;&nbsp;i&lt;N;&nbsp;i++)&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;=&nbsp;N-i;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;choice;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;</span><span class="string">"1.bubble&nbsp;2.insert&nbsp;3.select&nbsp;4.quick"</span><span>&lt;&lt;endl;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">clock_t</span><span>&nbsp;t1;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">clock_t</span><span>&nbsp;t2;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;choice;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">switch</span><span>(choice)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;1:&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1&nbsp;=&nbsp;clock();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bubble_sort(a,&nbsp;N);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2&nbsp;=&nbsp;clock();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;2:&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1&nbsp;=&nbsp;clock();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert_sort(a,&nbsp;N);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2&nbsp;=&nbsp;clock();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;3:&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1&nbsp;=&nbsp;clock();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select_sort(a,&nbsp;N);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2&nbsp;=&nbsp;clock();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;4:&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1&nbsp;=&nbsp;clock();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quick_sort(a,&nbsp;N);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2&nbsp;=&nbsp;clock();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;</span><span class="datatypes">double</span><span>(t2-t1)/CLOCKS_PER_SEC&nbsp;&lt;&lt;&nbsp;endl;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre style="display: none" class="cpp" name="code">#include &lt;iostream&gt;
using namespace std;
#include &lt;ctime&gt;

int main()
{
	const int N=100000;
	int a[N];
	while(1){	
		for(int i=0; i&lt;N; i++)
			a[i] = N-i;
		int choice;
		cout&lt;&lt;"1.bubble 2.insert 3.select 4.quick"&lt;&lt;endl;
		clock_t t1;
		clock_t t2;
		cin &gt;&gt; choice;
		switch(choice)
		{
			case 1:
				t1 = clock();
				bubble_sort(a, N);
				t2 = clock();
				break;
			case 2:
				t1 = clock();
				insert_sort(a, N);
				t2 = clock();
				break;
			case 3:
				t1 = clock();
				select_sort(a, N);
				t2 = clock();
				break;
			case 4:
				t1 = clock();
				quick_sort(a, N);
				t2 = clock();
				break;
		}
		cout &lt;&lt; double(t2-t1)/CLOCKS_PER_SEC &lt;&lt; endl;
	}	
	return 0;
}</pre>
<p>&nbsp;</p>
<p>测试结果如下图：</p>
<p><img alt="" src="http://my.csdn.net/uploads/201206/25/1340632925_2479.png" /></p>
<p>从上图可以看出，快排确实很快，冒泡让人无语，插入比选择稍快一些。</p></div></div><img src ="http://www.cppblog.com/doogoofeng/aggbug/192689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/doogoofeng/" target="_blank">doogoofeng</a> 2012-10-03 02:06 <a href="http://www.cppblog.com/doogoofeng/archive/2012/10/03/192689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用算法经典代码（C＋＋实现）</title><link>http://www.cppblog.com/doogoofeng/archive/2012/09/28/192209.html</link><dc:creator>doogoofeng</dc:creator><author>doogoofeng</author><pubDate>Fri, 28 Sep 2012 00:29:00 GMT</pubDate><guid>http://www.cppblog.com/doogoofeng/archive/2012/09/28/192209.html</guid><wfw:comment>http://www.cppblog.com/doogoofeng/comments/192209.html</wfw:comment><comments>http://www.cppblog.com/doogoofeng/archive/2012/09/28/192209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/doogoofeng/comments/commentRss/192209.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/doogoofeng/services/trackbacks/192209.html</trackback:ping><description><![CDATA[<div><font style="background-color: #fffbf0">原文地址：<a href="http://www.jianxu.net/useful-resources/algorithm/%e5%b8%b8%e7%94%a8%e7%ae%97%e6%b3%95%e7%bb%8f%e5%85%b8%e4%bb%a3%e7%a0%81%ef%bc%88c%ef%bc%8b%ef%bc%8b%e5%ae%9e%e7%8e%b0%ef%bc%89/">http://www.jianxu.net/useful-resources/algorithm/%e5%b8%b8%e7%94%a8%e7%ae%97%e6%b3%95%e7%bb%8f%e5%85%b8%e4%bb%a3%e7%a0%81%ef%bc%88c%ef%bc%8b%ef%bc%8b%e5%ae%9e%e7%8e%b0%ef%bc%89/</a><br /><br /><br />
<p>这学期和下学期都要修算法课，每周都有海量算法作业，为思考各种算法常常茶饭不思，晚上失眠，白天萎靡不振。上周被各种背包问题折磨到不行，今天偶然发现这个常用算法经典代码合集，每个还有一语中的的注释，如获至宝。当然不能照抄答案了，作业还是得自己做，我会一边学习一边补充和完善下面的代码和注释，自己复习的同时造福广大人民群众。</p>
<p>&nbsp;</p>
<p>原文转自http://blog.csdn.net/sanguine1211/article/details/6627789，有修改。</p>
<p>&nbsp;</p>
<div id="blog_text">
<h1>一、快速排序</h1>
<p>void qsort(int x,int y) //待排序的数据存放在a[1]..a[n]数组中</p>
<p>{int h=x,r=y;</p>
<p>int m=a[(x+y)&gt;&gt;1]; //取中间的那个位置的值</p>
<p>while(h&lt;r)</p>
<p>{while (a[h]&lt;m) h++; //比中间那个位置的值小，循环直到找一个比中间那个值大的</p>
<p>while (a[r]&gt;m) r&#8211;; //比中间那个位置的值大，循环直到找一个比中间那个值小的</p>
<p>if(h&lt;=r)</p>
<p>{int temp=a[h];//如果此时h&lt;=r，交换a[h]和a[r]</p>
<p>a[h]=a[r];</p>
<p>a[r]=temp;</p>
<p>h++;r&#8211;; //这两句必不可少哦</p>
<p>}</p>
<p>}</p>
<p>if(r&gt;x) qsort(x,r);//注意此处，尾指针跑到前半部分了</p>
<p>if(h&lt;y) qsort(h,y); //注意此处，头指针跑到后半部分了</p>
<p>}</p>
<p>调用：qsort(1,n)即可实现数组a中元素有序。适用于n比较大的排序</p>
<p>&nbsp;</p>
<h1>二、冒泡排序</h1>
<p>void paopao(void) //待排序的数据存放在a[1]..a[n]数组中</p>
<p>{for(int i=1;i&lt;n;i++)&nbsp; //控制循环（冒泡）的次数，n个数，需要n-1次冒泡</p>
<p>for(int j=1;j&lt;=n-i;j++) //相邻的两两比较</p>
<p>if(a[j]&lt;a[j+1]) {int temp=a[j];a[j]=a[j+1];a[j+1]=temp;}</p>
<p>}</p>
<p>或者</p>
<p>void paopao(void) //待排序的数据存放在a[1]..a[n]数组中</p>
<p>{for(int i=1;i&lt;n;i++)&nbsp; //控制循环（冒泡）的次数，n个数，需要n-1次冒泡</p>
<p>for(int j=n-i;j&gt;=1;j&#8211;) //相邻的两两比较</p>
<p>if(a[j]&lt;a[j+1]) {int temp=a[j];a[j]=a[j+1];a[j+1]=temp;}</p>
<p>}</p>
<p>&nbsp;</p>
<p>调用：paopao()，适用于n比较小的排序</p>
<p>&nbsp;</p>
<h1>三、桶排序</h1>
<p>void bucketsort(void)//a的取值范围已知。如a&lt;=cmax。</p>
<p>{memset(tong,0,sizeof(tong));//桶初始化</p>
<p>for(int i=1;i&lt;=n;i++)//读入n个数</p>
<p>{int a</p>
<p>cin&gt;&gt;a;</p>
<p>tong[a]++;}//相应的桶号计数器加1</p>
<p>for(int i=1;i&lt;=cmax;i++)</p>
<p>{if(tong[i]&gt;0) //当桶中装的树大于0，说明i出现过tong[i]次，否则没出现过i</p>
<p>while (tong[i]!=0)</p>
<p>{tong[i]&#8211;;</p>
<p>cout&lt;&lt;i&lt;&lt;&#8217; &#8216;;}</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>桶排序适用于那些待排序的关键字的值在已知范围的排序。</p>
<p>&nbsp;</p>
<h1>四、合（归）并排序</h1>
<p>void merge(int l,int m,int r)//合并[l,m]和[m+1,r]两个已经有序的区间</p>
<p>{ int b[101];//借助一个新的数组B，使两个有序的子区间合并成一个有序的区间，b数组的大小要注意</p>
<p>int h,t,k;</p>
<p>k=0;//用于新数组B的指针</p>
<p>h=l;t=m+1;//让h指向第一个区间的第一个元素，t指向第二个区间的第一个元素。</p>
<p>while((h&lt;=m)&amp;&amp;(t&lt;=r))//在指针h和t没有到区间尾时，把两个区间的元素抄在新数组中</p>
<p>{k++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //新数组指针加1</p>
<p>if (a[h]&lt;a[t]){b[k]=a[h];h++;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //抄第一个区间元素到新数组</p>
<p>else{b[k]=a[t];t++;}&nbsp;&nbsp; //抄第二个区间元素到新数组</p>
<p>}</p>
<p>while(h&lt;=m){k++;b[k]=a[h];h++;}&nbsp; //如果第一个区间没有抄结束，把剩下的抄在新数组中</p>
<p>while(t&lt;=r){k++;b[k]=a[t];t++;}&nbsp;&nbsp; //如果第二个区间没有抄结束，把剩下的抄在新数组中</p>
<p>for(int o=1;o&lt;=k;o++)//把新数组中的元素，再抄回原来的区间，这两个连续的区间变为有序的区间。</p>
<p>a[l+o-1]=b[o];</p>
<p>}</p>
<p>void mergesort(int x,int y)//对区间[x,y]进行二路归并排序</p>
<p>{</p>
<p>int mid;</p>
<p>if(x&gt;=y) return;</p>
<p>mid=(x+y)/2;//求[x,y]区间，中间的那个点mid,mid把x,y区间一分为二</p>
<p>mergesort(x,mid);//对前一段进行二路归并</p>
<p>mergesort(mid+1,y);//对后一段进行二路归并</p>
<p>merge(x,mid,y);//把已经有序的前后两段进行合并</p>
<p>}</p>
<p>&nbsp;</p>
<p>归并排序应用了分治思想，把一个大问题，变成两个小问题。二分是分治的思想。</p>
<p>&nbsp;</p>
<h1>五、二分查找</h1>
<p>int find(int x,int y,int m) //在[x,y]区间查找关键字等于m的元素下标</p>
<p>{ int head,tail,mid;</p>
<p>head=x;tail=y;mid=((x+y)/2);//取中间元素下标</p>
<p>if(a[mid]==m) return mid;//如果中间元素值为m返回中间元素下标mid</p>
<p>if(head&gt;tail) return 0;//如果x&gt;y，查找失败，返回0</p>
<p>if(m&gt;a[mid])&nbsp; //如果m比中间元素大，在后半区间查找，返回后半区间查找结果</p>
<p>return find(mid+1,tail);</p>
<p>else //如果m比中间元素小，在前半区间查找，返回后前区间查找结果</p>
<p>return find(head,mid-1);</p>
<p>}</p>
<h1>六、高精度加法</h1>
<p>#include&lt;iostream&gt;</p>
<p>#include&lt;cstring&gt;</p>
<p>using namespace std;</p>
<p>int main()</p>
<p>{</p>
<p>string str1,str2;</p>
<p>int a[250],b[250],len;&nbsp; &nbsp;//数组的大小决定了计算的高精度最大位数</p>
<p>int i;</p>
<p>memset(a,0,sizeof(a));</p>
<p>memset(b,0,sizeof(b));</p>
<p>cin&gt;&gt;str1&gt;&gt;str2;&nbsp;&nbsp; //输入两个字符串</p>
<p>a[0]=str1.length();&nbsp; //取得第一个字符串的长度</p>
<p>for(i=1;i&lt;=a[0];i++)&nbsp; //把第一个字符串转换为整数，存放在数组a中</p>
<p>a[i]=str1[a[0]-i]-&#8217;0&#8242;;</p>
<p>b[0]=str2.length();&nbsp;&nbsp; //取得第二个字符串长度</p>
<p>for(i=1;i&lt;=b[0];i++)&nbsp;&nbsp; //把第二个字符串中的每一位转换为整数，存放在数组B中</p>
<p>b[i]=str2[b[0]-i]-&#8217;0&#8242;;</p>
<p>len=(a[0]&gt;b[0]?a[0]:b[0]); &nbsp;&nbsp;//取两个字符串最大的长度</p>
<p>for(i=1;i&lt;=len;i++)&nbsp;&nbsp; //做按位加法，同时处理进位</p>
<p>{</p>
<p>a[i]+=b[i];</p>
<p>a[i+1]+=a[i]/10;</p>
<p>a[i]%=10;</p>
<p>}</p>
<p>len++;&nbsp;&nbsp;&nbsp; //下面是去掉最高位的0，然后输出。</p>
<p>while((a[len]==0)&amp;&amp;(len&gt;1)) len&#8211;;</p>
<p>for(i=len;i&gt;=1;i&#8211;)</p>
<p>cout&lt;&lt;a[i];</p>
<p>return 0;</p>
<p>}</p>
<p>&nbsp;</p>
<p>注意：两个数相加，结果的位数，应该比两个数中大的那个数多一位。</p>
<p>&nbsp;</p>
<h1>七、高精度减法</h1>
<p>#include&lt;iostream&gt;</p>
<p>using namespace std;</p>
<p>int compare(string s1,string s2);</p>
<p>int main()</p>
<p>{</p>
<p>string str1,str2;</p>
<p>int a[250],b[250],len;</p>
<p>int i;</p>
<p>memset(a,0,sizeof(a));</p>
<p>memset(b,0,sizeof(b));</p>
<p>cin&gt;&gt;str1&gt;&gt;str2;</p>
<p>a[0]=str1.length();</p>
<p>for(i=1;i&lt;=a[0];i++)</p>
<p>a[i]=str1[a[0]-i]-&#8217;0&#8242;;</p>
<p>b[0]=str2.length();</p>
<p>for(i=1;i&lt;=b[0];i++)</p>
<p>b[i]=str2[b[0]-i]-&#8217;0&#8242;;</p>
<p>if((compare(str1,str2))==0)&nbsp; //大于等于，做按位减，并处理借位。</p>
<p>{</p>
<p>for(i=1;i&lt;=a[0];i++)</p>
<p>{a[i]-=b[i];</p>
<p>if (a[i]&lt;0) {a[i+1]&#8211;;a[i]+=10;}</p>
<p>}</p>
<p>a[0]++;</p>
<p>while((a[a[0]]==0)&amp;&amp;(a[0]&gt;1)) a[0]&#8211;;</p>
<p>for(i=a[0];i&gt;=1;i&#8211;)</p>
<p>cout&lt;&lt;a[i];</p>
<p>cout&lt;&lt;endl;</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>cout&lt;&lt;&#8217;-';&nbsp; //小于就输出负号</p>
<p>for(i=1;i&lt;=b[0];i++)&nbsp; //做按位减，大的减小的</p>
<p>{b[i]-=a[i];</p>
<p>if (b[i]&lt;0) {b[i+1]&#8211;;b[i]+=10;}</p>
<p>}</p>
<p>b[0]++;</p>
<p>while((b[b[0]]==0)&amp;&amp;(b[0]&gt;1)) b[0]&#8211;;</p>
<p>for(i=b[0];i&gt;=1;i&#8211;)</p>
<p>cout&lt;&lt;b[i];</p>
<p>cout&lt;&lt;endl;</p>
<p>}</p>
<p>return 0;</p>
<p>}</p>
<p>int compare(string s1,string s2)&nbsp; //比较字符串（两个数）数字的大小，大于等于返回0，小于返回1。</p>
<p>{</p>
<p>if(s1.length()&gt;s2.length()) return 0;&nbsp; //先比较长度，哪个字符串长，对应的那个数就大</p>
<p>if(s1.length()&lt;s2.length()) return 1;</p>
<p>for(int i=0;i&lt;=s1.length();i++)&nbsp; //长度相同时，就一位一位比较。</p>
<p>{</p>
<p>if(s1[i]&gt;s2[i]) return 0;</p>
<p>if(s1[i]&lt;s2[i]) return 1;</p>
<p>}</p>
<p>return 0;&nbsp;&nbsp; //如果长度相同，每一位也一样，就返回0，说明相等</p>
<p>}</p>
<p>&nbsp;</p>
<p>做减法时，首先要判断两个字符串的大小，决定是否输出负号，然后就是按位减法，注意处理借位。</p>
<p>&nbsp;</p>
<h1>八、高精度乘法</h1>
<p>#include&lt;iostream&gt;</p>
<p>#include&lt;cstring&gt;</p>
<p>using namespace std;</p>
<p>int main()</p>
<p>{</p>
<p>string str1,str2;</p>
<p>int a[250],b[250],c[500],len; &nbsp;&nbsp;&nbsp;//250位以内的两个数相乘</p>
<p>int i,j;</p>
<p>memset(a,0,sizeof(a));</p>
<p>memset(b,0,sizeof(b));</p>
<p>cin&gt;&gt;str1&gt;&gt;str2;</p>
<p>a[0]=str1.length();</p>
<p>for(i=1;i&lt;=a[0];i++)</p>
<p>a[i]=str1[a[0]-i]-&#8217;0&#8242;;</p>
<p>b[0]=str2.length();</p>
<p>for(i=1;i&lt;=b[0];i++)</p>
<p>b[i]=str2[b[0]-i]-&#8217;0&#8242;;</p>
<p>memset(c,0,sizeof(c));</p>
<p>for(i=1;i&lt;=a[0];i++)&nbsp;&nbsp; //做按位乘法同时处理进位，注意循环内语句的写法。</p>
<p>for(j=1;j&lt;=b[0];j++)</p>
<p>{</p>
<p>c[i+j-1]+=a[i]*b[j];</p>
<p>c[i+j]+=c[i+j-1]/10;</p>
<p>c[i+j-1]%=10;</p>
<p>}</p>
<p>len=a[0]+b[0]+1;&nbsp; //去掉最高位的0，然后输出</p>
<p>while((c[len]==0)&amp;&amp;(len&gt;1)) len&#8211;;&nbsp;&nbsp; //为什么此处要len&gt;1??</p>
<p>for(i=len;i&gt;=1;i&#8211;)</p>
<p>cout&lt;&lt;c[i];</p>
<p>return 0;</p>
<p>}</p>
<p>&nbsp;</p>
<p>注意：两个数相乘，结果的位数应该是这两个数的位数和减1。</p>
<p>优化：万进制</p>
<p>#include&lt;iostream&gt;</p>
<p>#include&lt;cstring&gt;</p>
<p>using namespace std;</p>
<p>void num1(int s[],string st1);</p>
<p>int a[2501],b[2501],c[5002];//此处可以进行2500位万进制乘法，即10000位十进制乘法。</p>
<p>Int main()</p>
<p>{</p>
<p>string str1,str2;</p>
<p>int len;</p>
<p>cin&gt;&gt;str1&gt;&gt;str2;</p>
<p>memset(a,0,sizeof(a));</p>
<p>memset(b,0,sizeof(b));</p>
<p>memset(c,0,sizeof(c));</p>
<p>num1(a,str1); //把str1从最低位开始，每4位存放在数组a中</p>
<p>num1(b,str2); //把str2从最低位开始，每4位存放在数组b中</p>
<p>for(int i=1;i&lt;=a[0];i++) //作按位乘法并处理进位，此处是万进制进位</p>
<p>for(int j=1;j&lt;=b[0];j++)</p>
<p>{</p>
<p>c[i+j-1]+=a[i]*b[j];</p>
<p>c[i+j]+=c[i+j-1]/10000;</p>
<p>c[i+j-1]%=10000;</p>
<p>}</p>
<p>len=a[0]+b[0];//a[0]和b[0]存放的是每个数按4位处理的位数</p>
<p>while ((c[len]==0)&amp;&amp;(len&gt;1)) len&#8211;;//去掉高位的0，并输出最高位</p>
<p>cout&lt;&lt;c[len];</p>
<p>for(int i=len-1;i&gt;=1;i&#8211;)//把剩下来的每一位还原成4位输出</p>
<p>{</p>
<p>if (c[i]&lt;1000) cout&lt;&lt;&#8217;0&#8217;;</p>
<p>if (c[i]&lt;100) cout&lt;&lt;&#8217;0&#8217;;</p>
<p>if (c[i]&lt;10) cout&lt;&lt;&#8217;0&#8217;;</p>
<p>cout&lt;&lt;c[i];</p>
<p>}</p>
<p>cout&lt;&lt;endl;</p>
<p>return 0;</p>
<p>}</p>
<p>void num1(int s[],string st1)//此函数的作用就是把字符串st1，按4位一组存放在数组s中</p>
<p>{&nbsp;&nbsp; int k=1,count=1;</p>
<p>s[0]=st1.length();//存放st1的长度，省去一长度变量</p>
<p>for(int i=s[0]-1;i&gt;=0;i&#8211;) //从最低位开始，处理每一位</p>
<p>{ if (count%4==0) {s[k]+=(st1[i]-&#8216;0&#8217;)*1000; if(i!=0) k++;}</p>
<p>if (count%4==1) s[k]=(st1[i]-&#8216;0&#8217;);</p>
<p>if (count%4==2) s[k]+=(st1[i]-&#8216;0&#8217;)*10;</p>
<p>if (count%4==3) s[k]+=(st1[i]-&#8216;0&#8217;)*100;</p>
<p>count++;</p>
<p>}</p>
<p>s[0]=k; //存放数组的位数，就是按4位处理后的万进制数的位数。</p>
<p>Return;</p>
<p>}</p>
<p>&nbsp;</p>
<p>九、高精度除法（以后会补上）</p>
<h1>十、筛选法建立素数表</h1>
<p>void maketable(int x)//建立X以内的素数表prim，prim[i]为0，表示i为素数，为1表示不是质数</p>
<p>{</p>
<p>memset(prim,0,sizeof(prim));//初始化质数表</p>
<p>prim[0]=1;prim[1]=1;prim[2]=0;//用筛选法求X以内的质数表</p>
<p>for(int i=2;i&lt;=x;i++)</p>
<p>if (prim[i]==0)</p>
<p>{int j=2*i;</p>
<p>while(j&lt;=x)</p>
<p>{prim[j]=1;j=j+i;}</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>对于那些算法中，经常要判断素数的问题，建立一个素数表，可以达到一劳永逸的目的。</p>
<p>&nbsp;</p>
<h1>十一、深度优先搜索</h1>
<p>void dfs(int x)&nbsp; \\以图的深度优先遍历为例。</p>
<p>{</p>
<p>cout&lt;&lt;x&lt;&lt;&#8216; &#8216;; \\访问x顶点</p>
<p>visited[x]=1; \\作已访问的标记</p>
<p>for(int k=1;k&lt;=n;k++) \\对与顶点x相邻而又没访问过的结点k进行深度优先搜索。</p>
<p>if((a[x][k]==1)&amp;&amp;(visited[k]==0))</p>
<p>dfs(k);</p>
<p>}</p>
<h1>十二、广度优先搜索</h1>
<p>void&nbsp; bfs(void) //按广度优先非递归遍历图G，n个顶点，编号为1..n。注：图不一定是连通的</p>
<p>{//使用辅助队列Q和访问标记数组visited。</p>
<p>for(v=1;v&lt;=n;v++)&nbsp; visited[v]=0；//标记数组初始化</p>
<p>for(v=1; v&lt;=n; v++)</p>
<p>if(visited[v]==0 ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //v尚未访问</p>
<p>int h=1,r=1;&nbsp;&nbsp;&nbsp; //置空的辅助队列q</p>
<p>visited[v]=1；//顶点v,作访问标记</p>
<p>cout&lt;&lt;v&lt;&lt;&#8216; &#8216;; //访问顶点v</p>
<p>q[r]=v；&nbsp;&nbsp;&nbsp; //v入队列</p>
<p>while(h&lt;=r) //当队列非空时循环</p>
<p>{</p>
<p>int tmp=q[h];&nbsp; //队头元素出队，并赋值给tmp</p>
<p>for(int j=1;j&lt;=n;j++)</p>
<p>if((visited[j]==0)&amp;&amp;(a[tmp][j]==1))</p>
<p>{//j为tmp的尚未访问的邻接顶点</p>
<p>visited[j]=1;&nbsp; 对j作访问标记</p>
<p>cout&lt;&lt;j&lt;&lt;&#8216; &#8216;; 访问j</p>
<p>r++; //队尾指针加1</p>
<p>q[r]=j; //j入队</p>
<p>}&nbsp; //end-if</p>
<p>h++;</p>
<p>}//end -while</p>
<p>}</p>
<h1>十三、二叉树的前序、中序和后序遍历</h1>
<p>void preorder(int x)//二叉树的先序遍历</p>
<p>{</p>
<p>if(x==0) return;</p>
<p>cout&lt;&lt;x;//先访问根</p>
<p>preorder(a[x].ld);//再先序遍历根的左子树</p>
<p>preorder(a[x].rd);//最后先序遍历根的右子树</p>
<p>}</p>
<p>&nbsp;</p>
<p>void inorder(int x)//二叉树的中序遍历</p>
<p>{</p>
<p>if(x==0) return;</p>
<p>preorder(a[x].ld);//先中序遍历根的左子树</p>
<p>cout&lt;&lt;x;//再访问根</p>
<p>preorder(a[x].rd);//最后中序遍历根的右子树</p>
<p>}</p>
<p>&nbsp;</p>
<p>void reorder(int x)//二叉树的后序遍历</p>
<p>{</p>
<p>if(x==0) return;</p>
<p>preorder(a[x].ld);//先后序遍历根的左子树</p>
<p>preorder(a[x].rd);//再后序遍历根的右子树</p>
<p>cout&lt;&lt;x;//最后访问根</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>十四、树转换为二叉树算法</p>
<p>&nbsp;</p>
<p>十五、二叉排序树</p>
<p>&nbsp;</p>
<h1>十六、哈夫曼树</h1>
<p>void haff(void) //构建哈夫曼树</p>
<p>{</p>
<p>for(int i=n+1;i&lt;=2*n-1;i++) //依次生成n-1个结点</p>
<p>{int l=fmin(i-1); //查找权值最小的结点的编号l</p>
<p>a[i].lchild=l; //把l作为结点i的左孩子</p>
<p>a[l].father=i; //把l的父结点修改为i</p>
<p>int r=fmin(i-1); //查找次小权值的编号r</p>
<p>a[i].rchild=r; //把l作为结点i的右孩子</p>
<p>a[r].father=i; //把r的父结点修改为i</p>
<p>a[i].da=a[l].da+a[r].da; //合并l,j结点，生成新结点i</p>
<p>}</p>
<p>}</p>
<p>int fmin(int k)//在1到K中寻找最小的权值的编号</p>
<p>{</p>
<p>int mins=0;</p>
<p>for(int s=1;s&lt;=k;s++)</p>
<p>if((a[mins].da&gt;a[s].da)&amp;&amp;(a[s].father==0)) //a[s].father=0,说明这个结点还不是别个结点</p>
<p>mins=s;&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; //的孩子，不等于0说明这个结点已经用过。</p>
<p>return mins;</p>
<p>}</p>
<p>void inorder(int x)//递归生成哈夫曼编码</p>
<p>{</p>
<p>if(a[x].father==0) {a[x].code=&#8221;&#8220;;}//根结点</p>
<p>if(a[a[x].father].lchild==x)&nbsp; a[x].code=a[a[x].father].code+&#8217;0&#8242;;</p>
<p>if(a[a[x].father].rchild==x)&nbsp; a[x].code=a[a[x].father].code+&#8217;1&#8242;;</p>
<p>if(a[x].lchild!=0) inorder(a[x].lchild);//递归生成左子树</p>
<p>if((a[x].lchild==0)&amp;&amp;(a[x].rchild==0))//输出叶子结点</p>
<p>cout&lt;&lt;a[x].da&lt;&lt;&#8217;:'&lt;&lt;a[x].code&lt;&lt;endl;</p>
<p>if(a[x].rchild!=0) inorder(a[x].rchild);//递归生成右子树</p>
<p>}</p>
<h1>十七、并查集</h1>
<p>int getfather(int x)//非递归求X结点的根结点的编号</p>
<p>{while(x!=father[x])</p>
<p>x=father[x];</p>
<p>return x;</p>
<p>}</p>
<p>&nbsp;</p>
<p>int getfather(int x)//递归求X结点的根结点的编号</p>
<p>{if(x==father[x]) return x;</p>
<p>else return getfather(father[x]);</p>
<p>}</p>
<p>&nbsp;</p>
<p>int getfather(int x)//非递归求X结点的根结点编号同时进行路径压缩</p>
<p>{int p=x;</p>
<p>while(p!=father[p])//循环结束后，P即为根结点</p>
<p>p=father[p];</p>
<p>while(x!=father[x])//从X结点沿X的父结点进行路径压缩</p>
<p>{int temp=father[x];//暂存X没有修改前的父结点</p>
<p>father[x]=p;//把X的父结点指向P</p>
<p>x=temp;</p>
<p>}</p>
<p>return p;</p>
<p>}</p>
<p>&nbsp;</p>
<p>int getfather(int x)//递归求X结点的根结点编号同时进行路径压缩</p>
<p>{if(x==father[x]) return x;</p>
<p>else {</p>
<p>int temp=getfather(father[x]);</p>
<p>father[x]=temp;</p>
<p>return temp;</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>void merge(int x,int y)//合并x,y两个结点</p>
<p>{int x1,x2;</p>
<p>x1=getfather(x);//取得X的父结点</p>
<p>x2=getfather(y);//取得Y的父结点</p>
<p>if(x1!=x2) father[x1]=x2; //两个父结点不同的话就合并，注意：合并的是X，Y两个结点的根。</p>
<p>}</p>
<p>&nbsp;</p>
<h1>十八、Prime算法</h1>
<p>void prime(void) //prim算法求最小生成树，elist[i]是边集数组，a[i][j]为&lt;I,j&gt;的权值。edge为结构体类型。</p>
<p>{for (int i=1;i&lt;=n-1;i++)//初始化结点1到其它n-1个结点形成的边集</p>
<p>{elist[i].from=1;</p>
<p>elist[i].to=i+1;</p>
<p>elist[i].w=a[1][i+1];</p>
<p>}</p>
<p>for (int i=1;i&lt;=n-1;i++)//依次确定n-1条边</p>
<p>{int m=i;</p>
<p>for(int j=i+1;j&lt;=n-1;j++)//确定第i条边时，依次在i+1至n-1条边中找最小的那条边</p>
<p>if(elist[j].w&lt;elist[m].w) m=j;</p>
<p>if(m!=i) //如果最小的边不是第i条边就交换</p>
<p>{edge tmp=elist[i];elist[i]=elist[m];elist[m]=tmp;}</p>
<p>for(int j=i+1;j&lt;=n-1;j++)//更新第i+1至n-1条边的最小距离。</p>
<p>{if(elist[j].w&gt;a[elist[i].to][elist[j].to]) elist[j].w=a[elist[i].to][elist[j].to];}</p>
<p>}</p>
<p>for(int i=1;i&lt;=n-1;i++)//求最小生成树的值</p>
<p>ans=ans+elist[i].w;</p>
<p>}</p>
<p>&nbsp;</p>
<p>如果要求出哪些边构成最小生成树，在更新第i+1至n-1条边到已经生成的树中最小距离时(上面代码中加粗的部分)，还要加上elist[j].from=elist[i].to;语句，即在更新权值时，还应该更新起点。</p>
<p>Prime算法适用于顶点不是太多的稠密图，如果对于顶点数较多的稀疏图，就不太适用了。</p>
<p>&nbsp;</p>
<h1>十九、Dijkstra算法</h1>
<p>void dijkstra(int x)&nbsp; //求结点x到各个结点的最短路径</p>
<p>{</p>
<p>memset(vis,0,sizeof(vis)); //初始化，vis[i]＝0表示源点到结点i未求，否则已求</p>
<p>vis[x]=1;pre[x]=0; //初始化源点。</p>
<p>for(int i=1;i&lt;=n;i++)&nbsp;&nbsp; //对其它各点初始化。</p>
<p>if(i!=x)</p>
<p>{</p>
<p>dis[i]=g[x][i];</p>
<p>pre[i]=x;</p>
<p>}</p>
<p>for(int i=1;i&lt;=n-1;i++)&nbsp;&nbsp; //对于n个结点的图，要求x到其它n-1个结点的最短距离</p>
<p>{</p>
<p>int m=big; //虚拟一个最大的数big=99999999;</p>
<p>int k=x;</p>
<p>for(int j=1;j&lt;=n;j++)&nbsp;&nbsp; //在未求出的结点中找一个源点到其距离最小的点</p>
<p>if(vis[j]==0&amp;&amp;m&gt;dis[j])</p>
<p>{</p>
<p>m=dis[j];</p>
<p>k=j;</p>
<p>}</p>
<p>vis[k]=1;&nbsp;&nbsp; //思考：如果k=X说明什么？说明后面的点，无解。</p>
<p>for(int j=1;j&lt;=n;j++)&nbsp;&nbsp; //用当前找的结点更新未求结点到X的最短路径</p>
<p>if((vis[j]==0)&amp;&amp;(dis[k]+g[k][j]&lt;dis[j]))</p>
<p>{</p>
<p>dis[j]=dis[k]+g[k][j];&nbsp; //更新</p>
<p>pre[j]=k;&nbsp; //保存前趋结点，以便后面求路径</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>说明：dis[i]表示x到i的最短距离，pre[i]表示i结点的前趋结点。</p>
<h1>二十、Kruscal算法</h1>
<p>void qsort(int x,int y)//对边集数组进行快速排序</p>
<p>{int h=x,r=y,m=elist[(h+r)&gt;&gt;1].w;</p>
<p>while(h&lt;r)</p>
<p>{while(elist[h].w&lt;m) h++;</p>
<p>while(elist[r].w&gt;m) r&#8211;;</p>
<p>if(h&lt;=r)</p>
<p>{edge tmp=elist[h];elist[h]=elist[r];elist[r]=tmp;h++;r&#8211;;}</p>
<p>}</p>
<p>if(x&lt;r) qsort(x,r);</p>
<p>if(h&lt;y) qsort(h,y);</p>
<p>}</p>
<p>&nbsp;</p>
<p>int getfather(int x)//找根结点，并压缩路径，此处用递归实现的。</p>
<p>{if(x==father[x]) return x;</p>
<p>else {</p>
<p>int f=getfather(father[x]);</p>
<p>father[x]=f;</p>
<p>return f;</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>void merge(int x,int y)//合并x,y结点，在此题中的x,y为两个根结点。</p>
<p>{father[x]=y;}</p>
<p>&nbsp;</p>
<p>void kruscal(void)</p>
<p>{int sum=0,ans=0;</p>
<p>qsort(1,t);//对t条边按权值大小按从小到大的次序进行快速排序</p>
<p>for(int i=1;i&lt;=t;i++)</p>
<p>{int x1=getfather(elist[i].from);//取第i条边的起点所在的树的根</p>
<p>int x2=getfather(elist[i].to);//&nbsp;取第i条边的终点所在的树的根</p>
<p>if(x1!=x2)</p>
<p>{sum++;merge(x1,x2);ans+=elist[i].w;}//不在同一个集合，合并，即第i条边可以选取。</p>
<p>if(sum&gt;n-1)</p>
<p>break;//已经确定了n-1条边了，最小生成树已经生成了，可以提前退出循环了</p>
<p>}</p>
<p>if(sum&lt;n-1)</p>
<p>cout&lt;&lt;&#8221;Impossible&#8221;&lt;&lt;endl; //从t条边中无法确定n-1条边，说明无法生成最小生成树</p>
<p>else</p>
<p>cout&lt;&lt;ans&lt;&lt;endl;</p>
<p>}</p>
<p>&nbsp;</p>
<p>克 鲁斯卡尔算法，只用了边集数组，没有用到图的邻接矩阵，因此当图的结点数比较多的时候，输入数据又是边的信息时，就要考虑用Kruscal算法。对于岛国 问题，我们就要选择此算法，如果用Prim算法，还要开一个二维的数组来表示图的邻接矩阵，对于10000个点的数据，显然在空间上是无法容忍的。</p>
<p>&nbsp;</p>
<h1>二十一、Floyed算法</h1>
<p>void floyed(void)//&nbsp;a[i][j]表示结点i到结点j的最短路径长度，初始时值为&lt;I,J&gt;的权值。</p>
<p>{for(int k=1;k&lt;=n;k++) //枚举中间加入的结点不超过K时f[i][j]最短路径长度，K相当DP中的阶段</p>
<p>for(int i=1;i&lt;=n;i++) //i，j是结点i到结点J，相当于DP中的状态</p>
<p>for(int j=1;j&lt;=n;j++)</p>
<p>if (a[i][j]&gt;a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j];//这是决策，加和不加中间点，取最小的值</p>
<p>}</p>
<p>&nbsp;</p>
<p>弗洛伊德算法适合于求没有负权回路的图的最短路径长度，利用FLOYED算法，可写出判断结点i和结点J是否连通的算法。</p>
<p>&nbsp;</p>
<h1>二十二、01背包问题</h1>
<p>n为物品的数量，w[i]表示第i个物品的重量，c[i]表示第i个物品的价值，v为背包的最大重量。</p>
<p>有状态转移方程f[i][j]=max{f[i-1][j],f[i-1][j-w[i]]+c[i]}。f[i][j]表示前i个物品，在背包载重为j时获得的最大价值。显然f[n][v]即为所求。边界条件为f[0][s]=0,s=0,1,&#8230;,v。</p>
<p>for(int i=1;i&lt;=n;i++)//枚举阶段</p>
<p>for(int j=0;j&lt;=v;j++)//枚举状态，当然此处也可写成:for(int j=v;j&gt;=0;j&#8211;)</p>
<p>{</p>
<p>f[i][j]=f[i-1][j];//不选第i个物品</p>
<p>if(f[i][j]&lt;f[i-1][j-w[i]]+c[i]) f[i][j]=f[i-1][j-w[i]]+c[i];//选第i个物品</p>
<p>}</p>
<p>cout&lt;&lt;f[n][v]&lt;&lt;endl;//输出结果。</p>
<p>&nbsp;</p>
<p>优化：用一维数组实现，把第i-1阶段和第i阶段数据存在一块。</p>
<p>for(int i=1;i&lt;=n;i++)//枚举阶段</p>
<p>for(int j=v;j&gt;=0;j&#8211;)//枚举状态，当然此处也可写成:for(int j=v;j&gt;=0;j&#8211;)</p>
<p>{</p>
<p>f[j]=f[j];//不选第i个物品，可省略此语句。</p>
<p>if((j&gt;w[i])&amp;&amp;(f[j]&lt;f[j-w[i]]+c[i])) f[j]=f[j-w[i]]+c[i];//选第i个物品</p>
<p>}</p>
<p>cout&lt;&lt;f[v]&lt;&lt;endl;//输出结果。</p>
<p>&nbsp;</p>
<p>对 比优化前后，我们不难发现，优化后的代码实际上就是在原来基本的代码基础上，减少了阶段这一维，同时在枚举状态时，为了保证结果的正确性，枚举的顺序只能 是v到0，而不能是0到v。大家细想一下为什么？就是保证在求第i阶段j状态时，f[j-w[i]]为第i-1阶段的值。</p>
<p>&nbsp;</p>
<p>进一步优化，在上面代码中，枚举状态时，还可以写成for(int j=v;j&gt;=w[i];j&#8211;)，此时下面的判断条件j&gt;=w[i]就可以省略了。</p>
<p>&nbsp;</p>
<h1>二十三、完全背包问题</h1>
<p>和01背包问题不同的是，完全背包，对于任何一个物品i，只要背包重量允许，可以多次选取，也就是在决策上，可以选0个，1个，2个，&#8230;，v/w[i]个。</p>
<p>状 态转移方程f[i][j]=max{f[i-1][j],f[i-1][j-w[i]]+c[i]，f[i-1][j- 2*w[i]]+2*c[i]，&#8230;，f[i-1][j-k*w[i]]+k*c[i]}。k=0，1，2，&#8230;，v/w[i]。f[i][j]表示前i个物 品，在背包载重为j时获得的最大价值。显然f[n][v]即为所求。边界条件为f[0][s]=0,s=0,1,&#8230;,v。</p>
<p>for(int i=1;i&lt;=n;i++)//枚举阶段</p>
<p>for(int j=0;j&lt;=v;j++)//枚举状态，当然此处也可写成:for(int j=v;j&gt;=0;j&#8211;)</p>
<p>{f[i][j]=f[i-1][j];//k=0的情况作为f[i][j]的初始值，然后在k=1,2,&#8230;,v/w[i]中找最大值</p>
<p>for(int k=1;k&lt;=v/w[i];k++)</p>
<p>if(f[i][j]&lt;f[i-1][j-k*w[i]]+k*c[i]) f[i][j]=f[i-1][j-k*w[i]]+k*c[i];//选第i个物品</p>
<p>}</p>
<p>cout&lt;&lt;f[n][v]&lt;&lt;endl;//输出结果。</p>
<p>&nbsp;</p>
<p>二十四、多属性背包问题</p>
<p>&nbsp;</p>
<p>二十五、多背包问题</p>
<p>&nbsp;</p>
<h1>二十六、最长不降（上升）子序列问题</h1>
<p>&nbsp;</p>
<p>f[i]表示从第1个数开始，以第i个数结尾的最长递增子序列。</p>
<p>&nbsp;</p>
<p>状态转移方程：f[i]=max{f[j]}+1 （1&#8804;j&#8804;i-1，1&#8804;i&#8804;n，a[i]&#8805;a[j]）</p>
<p>临界状态：f[1]=1;</p>
<p>&nbsp;</p>
<h1>二十七、最长公共子序列问题</h1>
<p>&nbsp;</p>
<p>f[i][j]表示第一个串前i个字符和第二个串前j个字符的最长公共子序列数。</p>
<p>状态转移方程：</p>
<p>f[i-1][j-1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;(若a[i]==b[j])</p>
<p>f[i][j]=</p>
<p>max{f[i-1][j],f[i][j-1]}+1&nbsp;&nbsp;&nbsp;&nbsp; (若a[i]&#8800;b[j])</p>
<p>&nbsp;</p>
<p>临界状态:f[0][j]=0，f[i][0]=0</p></div></font></div><img src ="http://www.cppblog.com/doogoofeng/aggbug/192209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/doogoofeng/" target="_blank">doogoofeng</a> 2012-09-28 08:29 <a href="http://www.cppblog.com/doogoofeng/archive/2012/09/28/192209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>