﻿<?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>BlogJava-java fans-随笔分类-算法</title><link>http://www.blogjava.net/jlin/category/51569.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 27 Mar 2014 21:03:10 GMT</lastBuildDate><pubDate>Thu, 27 Mar 2014 21:03:10 GMT</pubDate><ttl>60</ttl><item><title>找出数组中唯一重复的数</title><link>http://www.blogjava.net/jlin/archive/2014/03/27/411576.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Thu, 27 Mar 2014 11:40:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/archive/2014/03/27/411576.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/411576.html</wfw:comment><comments>http://www.blogjava.net/jlin/archive/2014/03/27/411576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/411576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/411576.html</trackback:ping><description><![CDATA[<p>题目：</p>
<p>数组a[N]，1至N-1这N-1个数存放在a[N]中，其中某个数重复一次。写一个函数，找出被重复的数字。</p>
<p>方法一：异或法。</p>
<p>数组a[N]中的N个数异或结果与1至N-1异或的结果再做异或，得到的值即为所求。</p>
<ul><li><span class="comment">设重复数为A，其余N-2个数异或结果为B。</span>&nbsp;</li><li class="alt"><span class="comment">N个数异或结果为A^A^B</span>&nbsp;</li><li><span class="comment">1至N-1异或结果为A^B</span>&nbsp;</li><li class="alt"><span class="comment">由于异或满足交换律和结合律，且X^X&nbsp;=&nbsp;0&nbsp;&nbsp;0^X&nbsp;=&nbsp;X;</span>&nbsp;</li><li><span class="comment">则有</span>&nbsp;</li><li class="alt"><span class="comment">(A^B)^(A^A^B)=A^B^B=A</span>&nbsp;</li></ul>
<p>代码：</p>
<p>&nbsp;</p><pre><ol class="dp-cpp"><li class="alt"><span class="preprocessor">#include&nbsp;&lt;stdio.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&nbsp;&lt;stdlib.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="preprocessor">#include&nbsp;&lt;math.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&lt;time.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="keyword">void</span><span>&nbsp;xor_findDup(</span><span class="datatypes">int</span><span>&nbsp;*&nbsp;a,</span><span class="datatypes">int</span><span>&nbsp;N)&nbsp;&nbsp; &nbsp;</span></li><li><span>{&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;i;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;result=0;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(i=0;i&lt;N;i++)&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;^=&nbsp;a[i];&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(i=1;i&lt;N;i++)&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;^=&nbsp;i;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span class="string">"%d\n"</span><span>,result);&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span class="datatypes">int</span><span>&nbsp;main(</span><span class="datatypes">int</span><span>&nbsp;argc,&nbsp;</span><span class="datatypes">char</span><span>*&nbsp;argv[])&nbsp;&nbsp; &nbsp;</span></li><li><span>{&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;a[]&nbsp;=&nbsp;{1,2,1,3,4};&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;xor_findDup(a,5);&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp; &nbsp;</span></li><li><span>}&nbsp;&nbsp;&nbsp;</span></li></ol></pre>
<p>&nbsp;方法二：数学法。</p>
<p>对数组的所有项求和，减去1至N-1的和，即为所求数。</p>
<p>&nbsp;</p><pre><ol class="dp-cpp"><li class="alt"><span class="preprocessor">#include&nbsp;&lt;stdio.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&nbsp;&lt;stdlib.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="preprocessor">#include&nbsp;&lt;math.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&lt;time.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="keyword">void</span><span>&nbsp;xor_findDup(</span><span class="datatypes">int</span><span>&nbsp;*&nbsp;a,</span><span class="datatypes">int</span><span>&nbsp;N)&nbsp;&nbsp; &nbsp;</span></li><li><span>{&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;tmp1&nbsp;=&nbsp;0; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;tmp2&nbsp;=&nbsp;0; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;i=0;&nbsp;i&lt;N-1;&nbsp;++i) &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp1+=(i+1); &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp2+=a[i]; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;tmp2+=a[N-1]; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;result=tmp2-tmp1;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span class="string">"%d\n"</span><span>,result);&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>}&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span class="datatypes">int</span><span>&nbsp;main(</span><span class="datatypes">int</span><span>&nbsp;argc,&nbsp;</span><span class="datatypes">char</span><span>*&nbsp;argv[])&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>{&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;a[]&nbsp;=&nbsp;{1,2,4,3,4};&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;xor_findDup(a,5);&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;&nbsp;</span></li></ol></pre>
<p>对于求和，可以直接根据公式定义一个宏。#define sum(x)&nbsp; (x*(x+1)/2) <br />&nbsp;</p><pre><ol class="dp-cpp"><li class="alt"><span class="preprocessor">#include&nbsp;&lt;stdio.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&nbsp;&lt;stdlib.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="preprocessor">#include&nbsp;&lt;math.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&lt;time.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="preprocessor">#define&nbsp;sum(x)&nbsp;&nbsp;(x*(x+1)/2)&nbsp; </span><span>&nbsp;</span></li><li><span class="keyword">void</span><span>&nbsp;xor_findDup(</span><span class="datatypes">int</span><span>&nbsp;*&nbsp;a,</span><span class="datatypes">int</span><span>&nbsp;N)&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>{&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;tmp1&nbsp;=&nbsp;sum((N-1));</span><span class="comment">//注意N-1要加括号&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;tmp2&nbsp;=&nbsp;0; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;i=0;&nbsp;i&lt;N;&nbsp;++i)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp2+=a[i];&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;result=tmp2-tmp1;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span class="string">"%d\n"</span><span>,result);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span class="datatypes">int</span><span>&nbsp;main(</span><span class="datatypes">int</span><span>&nbsp;argc,&nbsp;</span><span class="datatypes">char</span><span>*&nbsp;argv[])&nbsp;&nbsp; &nbsp;</span></li><li><span>{&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;a[]&nbsp;=&nbsp;{1,2,4,2,3};&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;xor_findDup(a,5);&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp; &nbsp;</span></li><li><span>}&nbsp;&nbsp;&nbsp;</span></li></ol></pre>
<p>&nbsp;方法三：标志数组法</p>
<p>申请一个长度为n-1且均为'0'组成的字符串。然后从头遍历a[n]数组，取每个数组元素a[i]的值，将其对应的字符串中的相应位置置1，如果已经置过1的话，那么该数就是重复的数。就是用位图来实现的。 如果考虑空间复杂度的话，其空间O（N）</p>
<p>&nbsp;</p><pre><ol class="dp-cpp"><li class="alt"><span class="preprocessor">#include&nbsp;&lt;stdio.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&nbsp;&lt;stdlib.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="preprocessor">#include&nbsp;&lt;math.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&lt;time.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="preprocessor">#define&nbsp;sum(x)&nbsp;&nbsp;(x*(x+1)/2)&nbsp; </span><span>&nbsp;</span></li><li><span class="keyword">void</span><span>&nbsp;xor_findDup(</span><span class="datatypes">int</span><span>&nbsp;*&nbsp;arr,</span><span class="datatypes">int</span><span>&nbsp;NUM)&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>{&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;*arrayflag&nbsp;=&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;*)malloc(NUM*</span><span class="keyword">sizeof</span><span>(</span><span class="datatypes">int</span><span>));&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;i=1; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(i&lt;NUM) &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrayflag[i]&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(&nbsp;i=0;&nbsp;i&lt;NUM;&nbsp;i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&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="keyword">if</span><span>(arrayflag[arr[i]]&nbsp;==&nbsp;</span><span class="keyword">false</span><span>)&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;&nbsp;&nbsp;arrayflag[arr[i]]&nbsp;=&nbsp;</span><span class="keyword">true</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;置出现标志 </span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span class="string">"%d\n"</span><span>,arr[i]); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;;&nbsp;</span><span class="comment">//返回已经出现的值 </span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span class="datatypes">int</span><span>&nbsp;main(</span><span class="datatypes">int</span><span>&nbsp;argc,&nbsp;</span><span class="datatypes">char</span><span>*&nbsp;argv[])&nbsp;&nbsp; &nbsp;</span></li><li><span>{&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;a[]&nbsp;=&nbsp;{1,3,2,4,3};&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;xor_findDup(a,5);&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp; &nbsp;</span></li><li><span>}&nbsp;&nbsp; &nbsp;</span></li></ol></pre>
<p>&nbsp;方法四：固定偏移量法</p>
<p>a[N]，里面是1至N-1。原数组a[i]最大是N-1，若a[i]=K在某处出现后，将a[K]加一次N，做标记，当某处a[i]=K再次成立时，查看a[K]即可知道K已经出现过。该方法不用另外开辟O(N)的内存空间，但是在查重之后要将数组进行恢复。</p>
<p>&nbsp;</p><pre><ol class="dp-cpp"><li class="alt"><span class="preprocessor">#include&nbsp;&lt;stdio.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&nbsp;&lt;stdlib.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="preprocessor">#include&nbsp;&lt;math.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&lt;time.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="keyword">void</span><span>&nbsp;xor_findDup(</span><span class="datatypes">int</span><span>&nbsp;*&nbsp;arr,</span><span class="datatypes">int</span><span>&nbsp;NUM)&nbsp;&nbsp; &nbsp;</span></li><li><span>{&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;temp=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><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;&nbsp;i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;</span></li><li><span>&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="keyword">if</span><span>(arr[i]&gt;=NUM)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=arr[i]-NUM;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;该值重复了，因为曾经加过一次了&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&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;&nbsp;&nbsp;temp=arr[i];&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;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(arr[temp]&lt;NUM)&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;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr[temp]+=NUM;&nbsp;</span><span class="comment">//做上标记&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>&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="keyword">else</span><span>&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;&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;printf(</span><span class="string">"有重复&nbsp;%d\n"</span><span>,temp);&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;&nbsp;&nbsp;</span><span class="keyword">return</span><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;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span class="string">"无重复"</span><span>); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;;&nbsp; &nbsp;</span></li><li><span>}&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span class="keyword">void</span><span>&nbsp;clear(</span><span class="datatypes">int</span><span>&nbsp;*data,</span><span class="datatypes">int</span><span>&nbsp;num)</span><span class="comment">//清理数据 </span><span>&nbsp;</span></li><li><span>{ &nbsp;</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;i&lt;num;i++) &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(data[i]&gt;num) &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[i]-=num; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span class="datatypes">int</span><span>&nbsp;main(</span><span class="datatypes">int</span><span>&nbsp;argc,&nbsp;</span><span class="datatypes">char</span><span>*&nbsp;argv[])&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>{&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;a[]&nbsp;=&nbsp;{2,4,3,4,1};&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;xor_findDup(a,5);&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;clear(a,5); &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp; &nbsp;</span></li><li><span>}&nbsp;&nbsp; &nbsp;</span></li></ol></pre>
<p>&nbsp;方法五：符号标志法</p>
<p>上个方法出现后是加N，也可以出现后加个负号，就是符号标志法。</p>
<p>&nbsp;</p><pre><ol class="dp-cpp"><li class="alt"><span class="preprocessor">#include&nbsp;&lt;stdio.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&nbsp;&lt;stdlib.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="preprocessor">#include&nbsp;&lt;string.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&nbsp;&lt;math.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="preprocessor">#include&lt;time.h&gt; </span><span>&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span class="keyword">void</span><span>&nbsp;xor_findDup(</span><span class="datatypes">int</span><span>&nbsp;*&nbsp;arr,</span><span class="datatypes">int</span><span>&nbsp;NUM)&nbsp;&nbsp; &nbsp;</span></li><li><span>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;temp=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><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;&nbsp;i++)&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(arr[i]&lt;0)&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=0-arr[i];&nbsp;&nbsp;</span><span class="comment">//&nbsp;该值重复了，因为曾经加过一次了&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&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;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=arr[i];&nbsp;&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;</span><span class="keyword">if</span><span>(arr[temp]&gt;0)&nbsp;&nbsp;&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;&nbsp;&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;&nbsp;&nbsp;arr[temp]=0-arr[temp];&nbsp;</span><span class="comment">//做上标记&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&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;</span><span class="keyword">else</span><span>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span class="string">"有重复&nbsp;%d\n"</span><span>,temp);&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">return</span><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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span class="string">"无重复"</span><span>);&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;clear(</span><span class="datatypes">int</span><span>&nbsp;*data,</span><span class="datatypes">int</span><span>&nbsp;num)</span><span class="comment">//清理数据 </span><span>&nbsp;</span></li><li><span>&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span>&nbsp;i=0;i&lt;num;i++)&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&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;</span><span class="keyword">if</span><span>(data[i]&lt;0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[i]=0-data[i];&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>}&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;</span><span class="datatypes">int</span><span>&nbsp;main(</span><span class="datatypes">int</span><span>&nbsp;argc,&nbsp;</span><span class="datatypes">char</span><span>*&nbsp;argv[])&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;a[]&nbsp;=&nbsp;{3,2,1,4,1};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor_findDup(a,5);&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clear(a,5);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li></ol></pre>
<p>以上的方法对数组元素的值的范围是有限制的，如果数组元素的值不是在1至N-1范围时，可以先求出数组元素的最大值。</p>
<p>&nbsp;</p>
<ol class="dp-cpp"><li class="alt"><span class="preprocessor">#include&nbsp;&lt;stdio.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&nbsp;&lt;stdlib.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="preprocessor">#include&nbsp;&lt;string.h&gt; </span><span>&nbsp;</span></li><li><span class="preprocessor">#include&nbsp;&lt;math.h&gt; </span><span>&nbsp;</span></li><li class="alt"><span class="preprocessor">#include&lt;time.h&gt; </span><span>&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span class="datatypes">int</span><span>&nbsp;&nbsp;do_dup_mal(</span><span class="datatypes">int</span><span>&nbsp;arr[],&nbsp;</span><span class="datatypes">int</span><span>&nbsp;n,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;*pre,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;*back) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;MAX&nbsp;=&nbsp;-1; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;i&nbsp;=&nbsp;0; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;sameVal&nbsp;=&nbsp;-1; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;*pre&nbsp;=&nbsp;*back&nbsp;=&nbsp;-1; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;j=0;&nbsp;j&lt;n;&nbsp;j++) &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(arr[j]&nbsp;&gt;&nbsp;MAX)&nbsp;MAX&nbsp;=&nbsp;arr[j];</span><span class="comment">//找出数组中的最大数 </span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">char</span><span>&nbsp;*arrayflag&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="datatypes">char</span><span>[MAX+1]&nbsp;; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(NULL&nbsp;==&nbsp;arrayflag) &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;-1; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;memset(arrayflag,&nbsp;0,&nbsp;MAX+1&nbsp;);&nbsp;</span><span class="comment">//&nbsp;'\0'&nbsp;==&nbsp;0 </span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(i=0;&nbsp;i&lt;n;&nbsp;i++) &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(arrayflag[arr[i]]&nbsp;==&nbsp;</span><span class="string">'\0'</span><span>) &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrayflag[arr[i]]&nbsp;=&nbsp;</span><span class="string">'\1'</span><span>;&nbsp;</span><span class="comment">//&nbsp;置出现标志 </span><span>&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span></li><li><span>&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;sameVal&nbsp;=&nbsp;arr[i];&nbsp;</span><span class="comment">//返回已经出现的值 </span><span>&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*back&nbsp;=&nbsp;i; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">delete</span><span>[]&nbsp;arrayflag; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(i&nbsp;&lt;&nbsp;n) &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;j=0;&nbsp;j&lt;n;&nbsp;j++) &nbsp;</span></li><li><span>&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">if</span><span>&nbsp;(sameVal&nbsp;==&nbsp;arr[j]) &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;*pre&nbsp;=&nbsp;j; &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">return</span><span>&nbsp;</span><span class="keyword">true</span><span>; &nbsp;</span></li><li class="alt"><span>&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;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span>&nbsp;</span></li><li><span>&nbsp;</span></li><li class="alt"><span class="keyword">void</span><span>&nbsp;main(</span><span class="datatypes">int</span><span>&nbsp;argc,&nbsp;</span><span class="datatypes">char</span><span>&nbsp;*argv[]) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;prePos&nbsp;=&nbsp;-1,&nbsp;backPos&nbsp;=&nbsp;-1; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;myArry[11]; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;myArry[0]&nbsp;=&nbsp;1; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;myArry[1]&nbsp;=&nbsp;3; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;myArry[2]&nbsp;=&nbsp;3; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;myArry[3]&nbsp;=&nbsp;4; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;myArry[4]&nbsp;=&nbsp;5; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;myArry[5]&nbsp;=&nbsp;22; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;myArry[6]&nbsp;=&nbsp;7; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;myArry[7]&nbsp;=&nbsp;13; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;myArry[8]&nbsp;=&nbsp;9; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;myArry[9]&nbsp;=&nbsp;2; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;myArry[10]&nbsp;=&nbsp;12; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(do_dup_mal(myArry,&nbsp;11,&nbsp;&amp;prePos,&nbsp;&amp;backPos)&nbsp;) &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span class="string">"%d\n"</span><span>,myArry[prePos]); &nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li></ol>
<p class="alt"><span>转：<a href="http://buptdtt.blog.51cto.com/2369962/749049">http://buptdtt.blog.51cto.com/2369962/749049</a>&nbsp;&nbsp;</span></p><img src ="http://www.blogjava.net/jlin/aggbug/411576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2014-03-27 19:40 <a href="http://www.blogjava.net/jlin/archive/2014/03/27/411576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速排序（Quicksort）的Javascript实现（转）</title><link>http://www.blogjava.net/jlin/archive/2013/04/11/397675.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Wed, 10 Apr 2013 16:35:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/archive/2013/04/11/397675.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/397675.html</wfw:comment><comments>http://www.blogjava.net/jlin/archive/2013/04/11/397675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/397675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/397675.html</trackback:ping><description><![CDATA[<p>目前，最常见的排序算法大概有七八种，其中<a href="http://en.wikipedia.org/wiki/Quicksort" target="_blank">"快速排序"</a>（Quicksort）使用得最广泛，速度也较快。它是图灵奖得主C. A. R. Hoare（1934--）于1960时提出来的。</p>
<p><img src="http://image.beekka.com/blog/201104/bg2011040402.jpg"  alt="" /></p>
<p>"快速排序"的思想很简单，整个排序过程只需要三步：</p>
<blockquote>
<p>　　（1）在数据集之中，选择一个元素作为"基准"（pivot）。</p>
<p>　　（2）所有小于"基准"的元素，都移到"基准"的左边；所有大于"基准"的元素，都移到"基准"的右边。</p>
<p>　　（3）对"基准"左边和右边的两个子集，不断重复第一步和第二步，直到所有子集只剩下一个元素为止。</p></blockquote>
<p>举例来说，现在有一个数据集{85, 24, 63, 45, 17, 31, 96, 50}，怎么对其排序呢？</p>
<p>第一步，选择中间的元素45作为"基准"。（基准值可以任意选择，但是选择中间的值比较容易理解。）</p>
<p><img src="http://image.beekka.com/blog/201104/bg2011040403.png"  alt="" /></p>
<p>第二步，按照顺序，将每个元素与"基准"进行比较，形成两个子集，一个"小于45"，另一个"大于等于45"。</p>
<p><img src="http://image.beekka.com/blog/201104/bg2011040404.png"  alt="" /></p>
<p>第三步，对两个子集不断重复第一步和第二步，直到所有子集只剩下一个元素为止。</p>
<p><img src="http://image.beekka.com/blog/201104/bg2011040405.png"  alt="" /></p>
<p><img src="http://image.beekka.com/blog/201104/bg2011040406.png"  alt="" /></p>
<p><img src="http://image.beekka.com/blog/201104/bg2011040407.png"  alt="" /></p>
<p><img src="http://image.beekka.com/blog/201104/bg2011040408.png"  alt="" /></p>
<p>下面参照网上的资料（<a href="http://acatalept.com/blog/2008/10/28/stable-quicksort-in-javascript/" target="_blank">这里</a>和<a href="http://www.stoimen.com/blog/2010/06/11/friday-algorithms-quicksort-difference-between-php-and-javascript/" target="_blank">这里</a>），用Javascript语言实现上面的算法。</p>
<p>首先，定义一个quickSort函数，它的参数是一个数组。</p>
<blockquote>
<p>var quickSort = function(arr) {</p>
<p>};</p></blockquote>
<p>然后，检查数组的元素个数，如果小于等于1，就返回。</p>
<blockquote>
<p>var quickSort = function(arr) {</p>
<p>　　<strong>if (arr.length &lt;= 1) { return arr; }</strong></p>
<p>};</p></blockquote>
<p>接着，选择"基准"（pivot），并将其与原数组分离，再定义两个空数组，用来存放一左一右的两个子集。</p>
<blockquote>
<p>var quickSort = function(arr) {</p>
<p>　　if (arr.length &lt;= 1) { return arr; }</p>
<p>　　<strong>var pivotIndex = Math.floor(arr.length / 2) ;</strong></p>
<p>　　<strong>var pivot = arr.splice(pivotIndex, 1)[0];</strong></p>
<p>　　<strong>var left = [];</strong></p>
<p>　　<strong>var right = [];</strong></p>
<p>};</p></blockquote>
<p>然后，开始遍历数组，小于"基准"的元素放入左边的子集，大于基准的元素放入右边的子集。</p>
<blockquote>
<p>var quickSort = function(arr) {</p>
<p>　　if (arr.length &lt;= 1) { return arr; }</p>
<p>　　var pivotIndex = Math.floor(arr.length / 2) ;</p>
<p>　　var pivot = arr.splice(pivotIndex, 1)[0];</p>
<p>　　var left = [];</p>
<p>　　var right = [];</p>
<p>　　<strong>for (var i = 0; i &lt; arr.length; i++){</strong></p>
<p>　　　　<strong>if (arr[i] &lt; pivot) {</strong></p>
<p>　　　　　　<strong>left.push(arr[i]);</strong></p>
<p>　　　　<strong>} else {</strong></p>
<p>　　　　　　<strong>right.push(arr[i]);</strong></p>
<p>　　　　<strong>}</strong></p>
<p>　　<strong>}</strong></p>
<p>};</p></blockquote>
<p>最后，使用递归不断重复这个过程，就可以得到排序后的数组。</p>
<blockquote>
<p>var quickSort = function(arr) {</p>
<p>　　if (arr.length &lt;= 1) { return arr; }</p>
<p>　　var pivotIndex = Math.floor(arr.length / 2);</p>
<p>　　var pivot = arr.splice(pivotIndex, 1)[0];</p>
<p>　　var left = [];</p>
<p>　　var right = [];</p>
<p>　　for (var i = 0; i &lt; arr.length; i++){</p>
<p>　　　　if (arr[i] &lt; pivot) {</p>
<p>　　　　　　left.push(arr[i]);</p>
<p>　　　　} else {</p>
<p>　　　　　　right.push(arr[i]);</p>
<p>　　　　}</p>
<p>　　}</p>
<p>　　<strong>return quickSort(left).concat([pivot], quickSort(right));</strong></p>
<p>};</p></blockquote>
<p>使用的时候，直接调用quickSort()就行了。 </p>
<p><img src="http://image.beekka.com/blog/201104/bg2011040409.png"  alt="" /></p>
<p>（完）<br /></p><!-- /div --><img src ="http://www.blogjava.net/jlin/aggbug/397675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2013-04-11 00:35 <a href="http://www.blogjava.net/jlin/archive/2013/04/11/397675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java实现快速排序(转)</title><link>http://www.blogjava.net/jlin/archive/2013/04/11/397674.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Wed, 10 Apr 2013 16:30:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/archive/2013/04/11/397674.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/397674.html</wfw:comment><comments>http://www.blogjava.net/jlin/archive/2013/04/11/397674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/397674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/397674.html</trackback:ping><description><![CDATA[&nbsp;说来感到惭愧，昨天看别人的博客上面一一讲了一些算法，其实这些算法在大学都学过，不过几乎全部忘记了。虽然现在做java上层开发基本上用不到算法，但是还是感觉算法是一种思想，是一种灵魂，所以又不仅翻开了严蔚敏老师的数据结构，一个一个把以前忘记的算法实现一遍。 
<p><br /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>快速排序的基本思想</strong>：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过一趟排序将待排序记录分割成独立的两部分，其中一部分记录的关键字均比另一部分关键字小，则分别对这两部分继续进行排序，直到整个序列有序。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 先看一下这幅图：</p>
<p><img alt="" src="http://hi.csdn.net/attachment/201202/23/0_1329967950X8ro.gif" /><br /></p>
<p>把整个序列看做一个数组，把第零个位置看做中轴，和最后一个比，如果比它小交换，比它大不做任何处理；交换了以后再和小的那端比，比它小不交换，比他大交换。这样循环往复，一趟排序完成，左边就是比中轴小的，右边就是比中轴大的，然后再用分治法，分别对这两个独立的数组进行排序。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; </p>
<div class="dp-highlighter bg_html" sizset="33" sizcache="3">
<div class="bar" sizset="33" sizcache="3">
<div class="tools" sizset="33" sizcache="3"><strong>[html]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">?</font></u></a></div></div>
<ol class="dp-xml"><li class="alt"><span>public&nbsp;int&nbsp;getMiddle(Integer[]&nbsp;list,&nbsp;int&nbsp;low,&nbsp;int&nbsp;high)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;</span><span class="attribute">tmp</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">list</span><span>[low];&nbsp;&nbsp;&nbsp;&nbsp;//数组的第一个作为中轴&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(low&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">high</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(low&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">high</span><span>&nbsp;&amp;&amp;&nbsp;list[high]&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;tmp)&nbsp;{&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;high--;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&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;list[low]&nbsp;=&nbsp;list[high];&nbsp;&nbsp;&nbsp;//比中轴小的记录移到低端&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(low&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">high</span><span>&nbsp;&amp;&amp;&nbsp;list[low]&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">tmp</span><span>)&nbsp;{&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;low++;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&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;list[high]&nbsp;=&nbsp;list[low];&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;list[low]&nbsp;=&nbsp;tmp;&nbsp;&nbsp;&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;return&nbsp;low;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回中轴的位置&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol></div><pre style="display: none" class="html" name="code">public int getMiddle(Integer[] list, int low, int high) {
		int tmp = list[low];    //数组的第一个作为中轴
		while (low &lt; high) {
			while (low &lt; high &amp;&amp; list[high] &gt; tmp) {
				high--;
			}
			list[low] = list[high];   //比中轴小的记录移到低端
			while (low &lt; high &amp;&amp; list[low] &lt; tmp) {
				low++;
			}
			list[high] = list[low];   //比中轴大的记录移到高端
		}
		list[low] = tmp;              //中轴记录到尾
		return low;                   //返回中轴的位置
	}</pre><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 递归形式的分治排序算法： 
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<div class="dp-highlighter bg_html" sizset="37" sizcache="3">
<div class="bar" sizset="37" sizcache="3">
<div class="tools" sizset="37" sizcache="3"><strong>[html]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">?</font></u></a></div></div>
<ol class="dp-xml"><li class="alt"><span>public&nbsp;void&nbsp;_quickSort(Integer[]&nbsp;list,&nbsp;int&nbsp;low,&nbsp;int&nbsp;high)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(low&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">high</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;</span><span class="attribute">middle</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">getMiddle</span><span>(list,&nbsp;low,&nbsp;high);&nbsp;&nbsp;//将list数组进行一分为二&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_quickSort(list,&nbsp;low,&nbsp;middle&nbsp;-&nbsp;1);&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;_quickSort(list,&nbsp;middle&nbsp;+&nbsp;1,&nbsp;high);&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;</span></li></ol></div><pre style="display: none" class="html" name="code">public void _quickSort(Integer[] list, int low, int high) {
		if (low &lt; high) {
			int middle = getMiddle(list, low, high);  //将list数组进行一分为二
			_quickSort(list, low, middle - 1);        //对低字表进行递归排序
			_quickSort(list, middle + 1, high);       //对高字表进行递归排序
		}
	}
</pre><br />&nbsp;&nbsp; 
<div class="dp-highlighter bg_html" sizset="41" sizcache="3">
<div class="bar" sizset="41" sizcache="3">
<div class="tools" sizset="41" sizcache="3"><strong>[html]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">?</font></u></a></div></div>
<ol class="dp-xml"><li class="alt"><span>public&nbsp;void&nbsp;quick(Integer[]&nbsp;str)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(str.length&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//查看数组是否为空&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_quickSort(str,&nbsp;0,&nbsp;str.length&nbsp;-&nbsp;1);&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;</span></li></ol></div><pre style="display: none" class="html" name="code">public void quick(Integer[] str) {
		if (str.length &gt; 0) {    //查看数组是否为空
			_quickSort(str, 0, str.length - 1);
		}
	}</pre><br />&nbsp;&nbsp; 编写测试方法： 
<p>&nbsp;</p>
<p>&nbsp; </p>
<div class="dp-highlighter bg_html" sizset="45" sizcache="3">
<div class="bar" sizset="45" sizcache="3">
<div class="tools" sizset="45" sizcache="3"><strong>[html]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/wangkuifeng0118/article/details/7286332#"><u><font color="#0000ff">?</font></u></a></div></div>
<ol class="dp-xml"><li class="alt"><span>public&nbsp;class&nbsp;TestMain&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;/**&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;args&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer[]&nbsp;</span><span class="attribute">list</span><span>={34,3,53,2,23,7,14,10};&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QuicSort&nbsp;</span><span class="attribute">qs</span><span>=</span><span class="attribute-value">new</span><span>&nbsp;QuicSort();&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qs.quick(list);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;</span><span class="attribute">i</span><span>=</span><span class="attribute-value">0</span><span>;i</span><span class="tag">&lt;</span><span class="tag-name">list.length</span><span>;i++){&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(list[i]+"&nbsp;");&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre style="display: none" class="html" name="code">public class TestMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
         Integer[] list={34,3,53,2,23,7,14,10};
         QuicSort qs=new QuicSort();
         qs.quick(list);
         for(int i=0;i&lt;list.length;i++){
        	 System.out.print(list[i]+" ");
         }
         System.out.println();
	}

}</pre>&nbsp;&nbsp;&nbsp;&nbsp; 看一下打印结果吧： 
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 2 3 7 10 14 23 34 53 <br />&nbsp;&nbsp;&nbsp; <br /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这样就排序好了，快速排序是对冒泡排序的一种改进，平均时间复杂度是O(nlogn)。<br /></p> <img src ="http://www.blogjava.net/jlin/aggbug/397674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2013-04-11 00:30 <a href="http://www.blogjava.net/jlin/archive/2013/04/11/397674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串匹配算法总结（转）</title><link>http://www.blogjava.net/jlin/archive/2012/04/29/377004.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Sat, 28 Apr 2012 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/archive/2012/04/29/377004.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/377004.html</wfw:comment><comments>http://www.blogjava.net/jlin/archive/2012/04/29/377004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/377004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/377004.html</trackback:ping><description><![CDATA[<div id="article_content" class="article_content">
<p>我想说一句&#8220;我日，我讨厌KMP！&#8221;。<br />KMP虽然经典，但是理解起来极其复杂，好不容易理解好了，便起码来巨麻烦！<br />老子就是今天图书馆在写了几个小时才勉强写了一个有bug的、效率不高的KMP，特别是计算next数组的部分。<br /><br />其实，比KMP算法速度快的算法大把大把，而且理解起来更简单，为何非要抓住KMP呢？笔试出现字符串模式匹配时直接上sunday算法，既简单又高效，何乐而不为？<br />说实话，想到sunday算法的那个人，绝对是发散思维，绝对牛。当我在被KMP折磨的够呛的时候，我就琢磨，有没有别的好算法呢？？琢磨了半天也没想出个所以然来。笨啊，脑子不够发散。<br /><br />下面贴上一位兄弟写的算法总结，很简单（建议KMP部分就不用看了，看了费脑子）。<br />参见：<a href="http://hi.baidu.com/willamette/blog/item/02bd0b5599c8b4c0b645ae06.html">http://hi.baidu.com/willamette/blog/item/02bd0b5599c8b4c0b645ae06.html</a></p>
<p>趁着做Presentation的功夫，顺便做一个总结</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">字符串匹配：</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: Times New Roman">---willamette</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">在匹配串中寻找模式串是否出现，注意和最长公共子序列相区别<span style="font-family: Times New Roman">(LCS: Longest Common Substring)</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><br /><strong>-：</strong><span style="font-family: Times New Roman"><strong>Brute Force(BF或蛮力搜索)</strong></span><strong>算法：</strong></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">这是世界上最简单的算法了。<br />首先将匹配串和模式串左对齐，然后从左向右一个一个进行比较，如果不成功则模式串向右移动一个单位。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">速度最慢。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">那么，怎么改进呢？</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">我们注意到<span style="font-family: Times New Roman">Brute Force</span>算法是每次移动一个单位，一个一个单位移动显然太慢，是不是可以找到一些办法，让每次能够让模式串多移动一些位置呢？</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">当然是可以的。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">我们也注意到，<span style="font-family: Times New Roman">Brute Force</span>是很不<span style="font-family: Times New Roman">intelligent</span>的，每次匹配不成功的时候，前面匹配成功的信息都被当作废物丢弃了，当然，就如现在的变废为宝一样，我们也同样可以将前面匹配成功的信息利用起来，极大地减少计算机的处理时间，节省成本。<span style="font-family: Times New Roman">^_^</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: Times New Roman">注意，蛮力搜索算法虽然速度慢，但其很通用，文章最后会有一些更多的关于蛮力搜索的信息。</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><br /><strong>-: KMP算法<br /></strong><br />首先介绍的就是<span style="font-family: Times New Roman">KMP</span>算法。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">原始论文：<span style="font-family: Times New Roman">Knuth D.E., Morris J.H., and Pratt V.R., Fast pattern matching in strings, SIAM Journal on Computing, 6(2), 323-350, 1977.</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">这个算法实在是太有名了，大学上的算法课程除了最笨的<span style="font-family: Times New Roman">Brute Force</span>算法，然后就介绍了<span style="font-family: Times New Roman">KMP</span>算法。也难怪，呵呵。谁让<span style="font-family: Times New Roman">Knuth D.E.</span>这么<span style="font-family: Times New Roman">world famous</span>呢，不仅拿了图灵奖，而且还写出了计算机界的<span style="font-family: Times New Roman">Bible &lt;The Art of Computer Programming&gt;(</span>业内人士一般简称<span style="font-family: Times New Roman">TAOCP).</span>稍稍提一下，有个叫<span style="font-family: Times New Roman">H.A.Simon</span>的家伙，不仅拿了<span style="font-family: Times New Roman">Turing Award</span>，顺手拿了个<span style="font-family: Times New Roman">Nobel Economics Award</span>，做了<span style="font-family: Times New Roman">AI</span>的爸爸，还是<span style="font-family: Times New Roman">Chicago Univ</span>的<span style="font-family: Times New Roman">Politics PhD</span>，可谓全才。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 'Times New Roman'">KMP的具体描述略去，教科书一大把。</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><br /><strong>-：Horspool算法<br /></strong><br /><span style="font-family: Times New Roman">Horspool</span>算法。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">当然，有市场就有竞争，字符串匹配这么大一个市场，不可能让<span style="font-family: Times New Roman">BF</span>和<span style="font-family: Times New Roman">KMP</span>全部占了，于是又出现了几个强劲的对手。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">第一个登场的是</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">论文：<span style="font-family: Times New Roman">Horspool R.N., 1980, Practical fast searching in strings, Software - Practice &amp; Experience, 10(6):501-506</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: Times New Roman">Horspool</span>算法的思想很简单的。不过有个创新之处就是模式串是从右向左进行比较的。很好很强大，为后来的算法影响很大。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">匹配串：<span style="font-family: Times New Roman"><span style="color: red">abcbc</span>sdxzcxx</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">模式串：<span style="color: red"><span style="font-family: Times New Roman">cbcac</span></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">这个时候我们从右向左进行对暗号，<span style="font-family: Times New Roman">c-c</span>，恩对上了，第二个<span style="font-family: Times New Roman">b-a</span>，不对啊，我们应该怎么办？难道就这么放弃么。于是，模式串从不匹配的那个字符开始从右向左寻找匹配串中不匹配的字符<span style="font-family: Times New Roman">b</span>的位置，结果发现居然有，赶快对上赶快对上，别耽误了。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">匹配串：<span style="font-family: Times New Roman">ab<span style="color: red">cbcsd</span>xzcxx</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">模式串：<span style="font-family: Times New Roman"><span> </span><span style="color: red">cbcac</span></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">然后继续从最右边的字符从右向左进行比较。这时候，我们发现了，<span style="font-family: Times New Roman">d-c</span>不匹配啊，而且模式穿里面没有噢，没办法，只好移动一个模式串长度的单位了。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">匹配串：<span style="font-family: Times New Roman">abcbcsd<span style="color: red">xzcxx</span></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">模式串：<span style="font-family: Times New Roman"><span> </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: red">cbcac<br /><br /><span style="color: #000000"><strong><span style="font-family: andale mono,times">-：Boyer-Moore算法</span></strong><br /></span><br /></span></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">对于BM算法，下面推荐一个讲解非常优秀的文章，可谓图文并茂啊，而且还是个MM写的。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">Boyer-Moore 经典单模式匹配算法<br /><a href="http://blog.csdn.net/iJuliet/archive/2009/05/19/4200771.aspx">http://blog.csdn.net/iJuliet/archive/2009/05/19/4200771.aspx</a><br /><br /><br /><strong>-：Sunday算法</strong></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">最后一个是<span style="font-family: Times New Roman">Sunday</span>算法，实际上比<span style="font-family: Times New Roman">Boyer-Moore</span>还快，呵呵。长江后浪推前浪。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">原始论文：<span style="font-family: Times New Roman">Daniel M. Sunday, A very fast substring search algorithm, Communications of the ACM, v.33 n.8, p.132-142, Aug. 1990</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">看原始论文的题目，<span style="font-family: Times New Roman">D.M. Sunday</span>貌似是故意想气气<span style="font-family: Times New Roman">Boyer-Moore</span>两位大牛似的。呵呵。不过实际上的确<span style="font-family: Times New Roman">Sunday</span>算法的确比<span style="font-family: Times New Roman">BM</span>算法要快，而且更简单。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: Times New Roman">Sunday</span>的算法思想和<span style="font-family: Times New Roman">Horspool</span>有些相似，但是。当出现不匹配的时候，却不是去找匹配串中不匹配的字符在模式串的位置，而是直接找最右边对齐的右一位的那个字符在模式串的位置。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">比如：</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">匹配串：<span style="font-family: Times New Roman"><span style="color: red">abcbc</span>zdxzc</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">模式串：<span style="color: red"><span style="font-family: Times New Roman">zbcac</span></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">恩，这里我们看到<span style="font-family: Times New Roman">b-a</span>没有对上，我们就看匹配串中的<span style="font-family: Times New Roman">z</span>在模式串的位置，然后，嘿嘿。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">匹配串：<span style="font-family: Times New Roman">abcbc<span style="color: red">zdxzc</span></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">模式串：<span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: red">zbcac</span></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">如果模式串中的没有那个字符怎么办呢？很简单，跳过去呗。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">匹配串：<span style="font-family: Times New Roman"><span style="color: red">abcbc</span>edxzcs</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">模式串：<span style="color: red"><span style="font-family: Times New Roman">zbcac</span></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: Times New Roman">e</span>不在模式串中出现</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">那么我们就</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">匹配串：<span style="font-family: Times New Roman">abcbce<span style="color: red">dxzcs</span></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">模式串：<span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: red">zbcac<br /><br />(2009/10/20补充)<br /><strong><span style="color: #000000">RK算法</span></strong></span></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">某一天在图书馆的一本算法分析设计书上翻到的。思路很新颖！和大家分享下。<br />在串匹配的简单算法中，把文本每m个字符构成的字符段作为一个字段，和模式进行匹配检查。如果能对一个长度为m的字符</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">串赋以一个Hash函数。那么显然只有那些与模式具有相同hash函数值的文本中的字符串才有可能与模式匹配，这是必要条件</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">，而没有必要去考虑文本中所有长度为m的字段，因而大大提高了串匹配的速度。因此RK算法的思想和KMP，BM，Sunday等思</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">路迥然不同！<br />（事实上，之前的串匹配方法，是将模式串的一个一个字符作为小的特征去分别进行匹配，而RK算法则是将串整体作为一个</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">特征！难就难在单个字符的特征很容易想得到，整体作为一个特征就没那么容易想得到了）<br />如果把整体作为一个特征，那么如何快速的求出这个整体特征的特征值？？<br />模式串的特征值仅需求一次即可。对于文本中的任意m个字符构成的字串如何快速的求特征就是个难点了。<br />抛砖引玉，这里给出一个简单的特征计算。 将字符串的每一个字符看做一个数，那么这个字符串的就是一个数字数组，通</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">过积分向量可以快速任意一个长度子字符串的向量和。可以把字符串的对应的字符数组的元素和看做这个字符串整体特征。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">这个特征是可以再O（1）的时间内求出的。其实原始的RK算法里面是把字符串看做一个26进制数在计算特征的。这里就不啰</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">嗦了，有兴趣的可以深入查找</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">aab<span style="color: #ff0000">see</span>sds 模式串 ees<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000">ees</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">发现 see向量和 == ees的向量和<br />然后就对see和ees做逐个字符的比较。发现不匹配继续往下走<br />aabs<span style="color: #ff0000">ees</span>ds 模式串 ees<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000">ees</span><br />发现 ees向量和 == ees的向量和 <br />然后就对ees和ees做逐个字符的比较。发现匹配OK。<br /><br />另外还有 字符串匹配自动机 后缀树算法（分在线和非在线两种）等 见如下文章。不能说那个比那个更好，各个算法都有自己的优势及最佳应用场合。参考：<br /><a href="http://blog.csdn.net/yifan403/archive/2009/06/16/4272793.aspx">http://blog.csdn.net/yifan403/archive/2009/06/16/4272793.aspx</a><br /><br />另外，关于多模式字符串匹配 有AC算法（字符串匹配自动机思想） WM算法（BM在多模式的推广应用）<br />参考：<br /><a href="http://blog.csdn.net/ijuliet/category/498465.aspx">http://blog.csdn.net/ijuliet/category/498465.aspx</a>&nbsp;该女子的blog有很多好文章。<br /><br />===============================================================================<br />一个sunday算法的实现<br /><a href="http://hi.baidu.com/azuryy/blog/item/10d3d3460b97af0e6b63e5cd.html">http://hi.baidu.com/azuryy/blog/item/10d3d3460b97af0e6b63e5cd.html</a></p>
<p>头文件定义：<br />/* Sunday.h */<br />class Sunday <br />{<br />public:<br />&nbsp;&nbsp; Sunday();<br />&nbsp;&nbsp; ~Sunday();<br /><br />public:<br />&nbsp;&nbsp;&nbsp; int find(const char* pattern, const char* text);<br /><br />private:<br />&nbsp;&nbsp;&nbsp; void preCompute(const char* pattern);<br /><br />private:<br />&nbsp;&nbsp;&nbsp; //Let's assume all characters are all ASCII<br />&nbsp;&nbsp;&nbsp; static const int ASSIZE = 128;<br />&nbsp;&nbsp;&nbsp; int _td[ASSIZE] ;<br />&nbsp;&nbsp;&nbsp; int _patLength;<br />&nbsp;&nbsp;&nbsp; int _textLength;<br />};<br /><br /><br />源文件<br />/* Sunday.cpp */<br /><br />Sunday::Sunday()<br />{<br />}<br /><br />Sunday::~Sunday()<br />{<br />}<br /><br />void Sunday::preCompute(const char* pattern)<br />{<br />&nbsp;&nbsp;&nbsp; for(int i = 0; i &lt; ASSIZE; i++ ) <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; _td[i] = _patLength + 1;<br /><br />&nbsp;&nbsp;&nbsp; const char* p;<br />&nbsp;&nbsp;&nbsp; for ( p = pattern; *p; p++)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; _td[*p] = _patLength - (p - pattern);<br />}<br /><br />int Sunday::find(const char* pattern, const char* text)<br />{<br />&nbsp;&nbsp;&nbsp; _patLength = strlen( pattern );<br />&nbsp;&nbsp;&nbsp; _textLength = strlen( text );<br /><br />&nbsp;&nbsp;&nbsp; if ( _patLength &lt;= 0 || _textLength &lt;= 0)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return -1;<br /><br />&nbsp;&nbsp;&nbsp; preCompute( pattern );<br /><br />&nbsp;&nbsp;&nbsp; const char *t, *p, *tx = text;<br /><br />&nbsp;&nbsp;&nbsp; while (tx + _patLength &lt;= text + _textLength) <br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (p = pattern, t = tx; *p; ++p, ++t)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (*p != *t)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (*p == 0)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return tx-text;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tx += _td[tx[_patLength]]; <br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return -1;<br />}<br /><br />简单测试下：<br />int main()<br /><br />{<br />&nbsp;&nbsp;&nbsp; char* text = "blog.csdn,blog.net";<br />&nbsp;&nbsp;&nbsp; char* pattern = "csdn,blog"&nbsp;&nbsp;&nbsp; ;<br />&nbsp;&nbsp;&nbsp; Sunday sunday;<br /><br />&nbsp;&nbsp;&nbsp; printf("The First Occurence at: %d/n",sunday.find(pattern,text));<br /><br />&nbsp;&nbsp;&nbsp; return 1;<br />}<br /><br />////////////////////////////////////////////<br />strstr的实现。<br />需要说明的是strstr是c语言提供的使用Brute Force实现的字符串匹配，简单、通用是其最大的优点。时间复杂度是O(mn)<br />// 下面是Microsoft的实现<br />//经典算法<br />//比KMP算法简单,没有KMP算法高效<br />char * __cdecl strstr (<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char * str1,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char * str2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *cp = (char *) str1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *s1, *s2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( !*str2 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return((char *)str1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (*cp)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s1 = cp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s2 = (char *) str2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( *s1 &amp;&amp; *s2 &amp;&amp; !(*s1-*s2) )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s1++, s2++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!*s2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return(cp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cp++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return(NULL);<br />} </p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/whoismickey/archive/2009/02/08/3869367.aspx">http://blog.csdn.net/whoismickey/archive/2009/02/08/3869367.aspx</a></p>
<h4 id="subjcns!7AC7C90F5324ACF3!219" class="beTitle">strstr</h4>
<div id="msgcns!7AC7C90F5324ACF3!219" class="bvMsg">
<div>&nbsp; glibc里的strstr函数用的是brute-force(naive)算法，它与其它算法的区别是strstr不对pattern(needle)进行预处理，所以用起来很方便。理论复杂度O</div>
<div>(mn),&nbsp;实际上，平均复杂度为O(n),&nbsp;大部分情况下高度优化的算法性能要优于基于自动机的匹配算法，关于串匹配算法可参考<a href="http://www-igm.univ-mlv.fr/~lecroq/string/">http://www-igm.univ-mlv.fr/~lecroq/string/</a>。&nbsp;glibc中使用了（1）Stephen R. van den Berg的实现，在他的基础上，（2）<span style="font-family: 'Courier New'">Tor Myklebust </span><a href="http://sources.redhat.com/ml/libc-alpha/2006-07/msg00028.html">http://sources.redhat.com/ml/libc-alpha/2006-07/msg00028.html</a>给出了更复杂的实现，当然也更高效。</div>
<div>&nbsp; BF有一个重要性质是事先不用知道串的长度，而基于跳跃的算法是需要用字符串长度来判断结束位置的。如何快速的确定字符串结束位置，可参考<a href="http://www.cppblog.com/ant/archive/2007/10/12/32886.html">http://www.cppblog.com/ant/archive/2007/10/12/32886.html</a>，写的很仔细。</div>
<div>&nbsp;将两种思想结合起来，可以做出更快的strstr（3）。约定（1） 为strstrBerg; (2) 为strstrBergo，（3）为lstrstr，（4）为glibc中的strstr，简单测试了一下：</div>
<div>从长度为2k的文本中查找长度为1、2、9的模式串，结果如下</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9</div>
<div>（1）0.000006 0.000006 0.000012&nbsp;&nbsp;&nbsp; </div>
<div>（2）0.000007 0.000004 0.000008</div>
<div>（3）0.000002 0.000002 0.000005</div>
<div>（4）0.000005 0.000005 0.000011<br /><a href="http://www.cppblog.com/Files/djxzh/Strstr.zip">下载strstr和测试程序</a>， <br />下载后执行 : <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unzip testStrstr.zip<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cd testStrstr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; make test</div>
<div><a href="http://www.cppblog.com/djxzh/archive/2008/10/28/65400.html" target="_blank">基于sse2的strstr函数</a> 是用sse2指令集对strstr的优化</div></div></div><img src ="http://www.blogjava.net/jlin/aggbug/377004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2012-04-29 00:06 <a href="http://www.blogjava.net/jlin/archive/2012/04/29/377004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boyer-Moore 经典单模式匹配算法（转）</title><link>http://www.blogjava.net/jlin/archive/2012/04/28/377001.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Sat, 28 Apr 2012 14:59:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/archive/2012/04/28/377001.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/377001.html</wfw:comment><comments>http://www.blogjava.net/jlin/archive/2012/04/28/377001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/377001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/377001.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 经典单模式匹配算法：KMP、BM；经典多模式匹配算法：AC、Wu-Manber。貌似实用中，KMP跟C库strstr()效率相当，而BM能快上3x-5x。于是小女不才花了小天的功夫来研究这个BM算法。BM如何快速匹配模式？它怎么跳跃地？我今儿一定要把大家伙儿讲明白了，讲不明白您佬跟帖，我买单，包教包会。模式，记为pat，用j作为索引; 文本，记为string（或text），用i作为索引。&...&nbsp;&nbsp;<a href='http://www.blogjava.net/jlin/archive/2012/04/28/377001.html'>阅读全文</a><img src ="http://www.blogjava.net/jlin/aggbug/377001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2012-04-28 22:59 <a href="http://www.blogjava.net/jlin/archive/2012/04/28/377001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>