﻿<?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-爱女孩的小火柴-文章分类-算法和数据结构</title><link>http://www.blogjava.net/mayu/category/23323.html</link><description>生活的理想就是为了理想的生活:)</description><language>zh-cn</language><lastBuildDate>Thu, 13 Sep 2007 10:43:22 GMT</lastBuildDate><pubDate>Thu, 13 Sep 2007 10:43:22 GMT</pubDate><ttl>60</ttl><item><title>对Java中四种基本排序的总结</title><link>http://www.blogjava.net/mayu/articles/144774.html</link><dc:creator>my</dc:creator><author>my</author><pubDate>Thu, 13 Sep 2007 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/mayu/articles/144774.html</guid><wfw:comment>http://www.blogjava.net/mayu/comments/144774.html</wfw:comment><comments>http://www.blogjava.net/mayu/articles/144774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mayu/comments/commentRss/144774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mayu/services/trackbacks/144774.html</trackback:ping><description><![CDATA[<table class="tableline" height="13" cellspacing="0" cellpadding="0" width="550" align="center" border="0">
    <tbody>
        <tr>
            <td class="mainfont" width="548" height="13">
            <div align="center">作者：佚名 文章来源：net 点击数：471 更新时间：2007-7-25 8:23:52 </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="3" width="600" align="center" border="0">
    <tbody>
        <tr>
            <td class="font14">
            <p style="text-indent: 2em">JAVA四种基本排序,包括冒泡法,插入法,选择法,SHELL排序法.其中选择法是冒泡法的改进,SHELL排序法是 插入法的改进.所以从根本上来说可以归纳为两种不同的排序方法:即:插入法＆冒泡法 </p>
            <p style="text-indent: 2em">一 插入法:
            <p style="text-indent: 2em">遍历排序集合，每到一个元素时，都要将这个元素与所有它之前的元素遍历比较一遍，让符合排序顺序的元素挨个移动到当前范围内它最应该出现的位置。交换是相邻遍历移动，双重循环控制实现.这种排序法属于地头蛇类型,在我的地牌上我要把所有的东西按一定的顺序规整,过来一个,规整一个.
            <p style="text-indent: 2em">处理代码如下:
            <p style="text-indent: 2em">
            <center><ccid_nobr>
            <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
                <tbody>
                    <tr>
                        <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
                        <pre><ccid_code>public void sort(int[] data) {
                        int temp;
                        for(int i=1; i〈data.length; i++){
                        for(int j=i; (j〉0)&amp;&amp;(data[j]〉data[j-1]); j--){
                        temp=date[j];
                        data[j]=data[j-1];
                        data[j-1]=temp; }
                        }
                        }</ccid_code></pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            </ccid_nobr></center>
            <p style="text-indent: 2em">
            <p style="text-indent: 2em">二冒泡法:
            <p style="text-indent: 2em">比较容易，它的内层循环保证遍历一次后，集合中最小（大）元素出现在它的正确位置，下一次就是次小元素。。。该方法在集合分布的各种情况下交换移动的次数基本不变，属于最慢的一种排序。实现也是双重循环控制。这种排序法属于过江龙,就是要找到极端,但是过奖龙也有大哥,二哥等,所以他们只能是大哥挑了二哥挑.
            <p style="text-indent: 2em">处理代码如下:
            <p style="text-indent: 2em">
            <p style="text-indent: 2em">
            <center><ccid_nobr>
            <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
                <tbody>
                    <tr>
                        <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
                        <pre><ccid_code>public static int [] maopao(int[] data) {
                        int temp;
                        for(int i=0; i〈data.length-1; i++){
                        for(int j=i+1; j〈data.length; j++){
                        if(data[i]〈data[j]){
                        temp=data[i];
                        data[i]=data[j];
                        data[j]=temp;
                        }
                        }
                        }
                        return data;</ccid_code></pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            </ccid_nobr></center>
            <p style="text-indent: 2em">
            <p style="text-indent: 2em">三选择法:
            <p style="text-indent: 2em">该方法只是通过遍历集合记录最小（大）元素的位置，一次遍历完后，再进行交换位置操作，类似冒泡，但在比较过程中，不进行交换操作，只记录元素位置。一次遍历只进行一次交换操作。这个对与交换次序比较费时的元素比较适合。这种排序法比冒泡法要城府要深的多,我先记住极端数据,待遍历数据完了之后,我再处理,不像冒泡法那样只要比自己极端一点的就要处理,选择法只处理本身范围内的最极端数据.
            <p style="text-indent: 2em">
            <p style="text-indent: 2em">
            <center><ccid_nobr>
            <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
                <tbody>
                    <tr>
                        <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
                        <pre><ccid_code>public static void xuanze(int[] data) {
                        int temp;
                        for (int i = 0; i 〈 data.length; i++) {
                        int lowIndex = i;
                        for (int j = data.length - 1; j 〉 i; j--) {
                        if (data[j] 〉 data[lowIndex]) {
                        lowIndex = j;
                        }
                        }
                        temp=data[i];
                        data[i]=data[lowIndex];
                        data[lowIndex]=temp;
                        }
                        }</ccid_code></pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            </ccid_nobr></center>
            <p style="text-indent: 2em">
            <p style="text-indent: 2em">四 Shell排序：
            <p style="text-indent: 2em">它是对插入排序的一种改进，是考虑将集合元素按照一定的基数划分成组去排序，让每一组在局部范围内先排成基本有序，最后在进行一次所有元素的插入排序。
            <p style="text-indent: 2em">
            <p style="text-indent: 2em">
            <center><ccid_nobr>
            <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
                <tbody>
                    <tr>
                        <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
                        <pre><ccid_code>public void sort(int[] data) {
                        for(int i=data.length/2; i〉2; i/=2){
                        for(int j=0; j〈i; j++){
                        insertSort(data,j,i);
                        }
                        }
                        insertSort(data,0,1);
                        }
                        private void insertSort(int[] data, int start, int inc) {
                        int temp;
                        for(int i=start+inc; i〈data.length; i+=inc){
                        for(int j=i; (j〉=inc)&amp;&amp;(data[j]〈data[j-inc]); j-=inc){
                        temp=data[j];
                        data[j]=data[j-inc]
                        data[j-inc]=temp;
                        }
                        }
                        }</ccid_code></pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            </center></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/mayu/aggbug/144774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mayu/" target="_blank">my</a> 2007-09-13 11:12 <a href="http://www.blogjava.net/mayu/articles/144774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有104瓶啤酒，每3个空瓶子能换一瓶新啤酒，问能喝到多少瓶啤酒？</title><link>http://www.blogjava.net/mayu/articles/120616.html</link><dc:creator>my</dc:creator><author>my</author><pubDate>Tue, 29 May 2007 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/mayu/articles/120616.html</guid><wfw:comment>http://www.blogjava.net/mayu/comments/120616.html</wfw:comment><comments>http://www.blogjava.net/mayu/articles/120616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mayu/comments/commentRss/120616.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mayu/services/trackbacks/120616.html</trackback:ping><description><![CDATA[/*有104瓶啤酒，每3个空瓶子能换一瓶新啤酒，问能喝到多少瓶啤酒？//递归算法*/<br>class&nbsp; Test<br>{&nbsp;&nbsp; <br>&nbsp;int&nbsp; sum=104;//开始喝的104瓶啤酒<br>&nbsp;int&nbsp; nullsum=104;//空酒瓶<br>&nbsp;<br>&nbsp;public static void main(String[] args) <br>&nbsp;{<br>&nbsp;&nbsp;Test test = new Test();<br>&nbsp;&nbsp;test.printSum();<br>&nbsp;}<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;public void printSum(){<br>&nbsp;&nbsp;System.out.println("可以喝到"+getSum()+"瓶酒");<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;<br>&nbsp;public&nbsp; int getSum(){<br>&nbsp;&nbsp;int tmp=0;<br>&nbsp;&nbsp;&nbsp;&nbsp; if(nullsum&gt;=3){<br>&nbsp;&nbsp;&nbsp;&nbsp;tmp=nullsum/3;//喝了多少瓶<br>&nbsp;&nbsp;&nbsp;&nbsp;sum+=tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;nullsum=nullsum%3;//还剩多少空瓶子<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nullsum+=tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;getSum();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("最后剩余空瓶子"+nullsum);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return sum; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;}<br>}<br>//问题是当剩2个空瓶子的时候，如果老板肯借一瓶给你就可以多喝一瓶，呵呵 
<img src ="http://www.blogjava.net/mayu/aggbug/120616.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mayu/" target="_blank">my</a> 2007-05-29 10:08 <a href="http://www.blogjava.net/mayu/articles/120616.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的排序算法zz</title><link>http://www.blogjava.net/mayu/articles/120488.html</link><dc:creator>my</dc:creator><author>my</author><pubDate>Mon, 28 May 2007 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/mayu/articles/120488.html</guid><wfw:comment>http://www.blogjava.net/mayu/comments/120488.html</wfw:comment><comments>http://www.blogjava.net/mayu/articles/120488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mayu/comments/commentRss/120488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mayu/services/trackbacks/120488.html</trackback:ping><description><![CDATA[<p>排序算法在程序中会用到很多，这里介绍几种常见的排序方法以及比较</p>
<p>冒泡排序：对一个队列里的数据，挨个进行轮询和交换，每次轮询出一个当前最大或者最小的值放在队尾，然后继续下次轮询，轮询长度-1，就跟冒泡一样，所以称为冒泡排序，运算时间复杂度N平方</p>
<p>选择排序：对一个队列里的数据，选出当前最大或者最小的值，然后将他与队首的数据交换，然后从第二个开始，进行相同的操作，运算时间复杂度N平方，但由于他不像冒泡一样需要不停的交换位置，所以会比冒泡快一些</p>
<p>插入排序：对一个队列里的数据，从第二个开始，与此位置之前的数据进行比较，形成局部有序的队列，循环此操作，直到队尾，运算时间复杂度依然为N平方，但他由于保证了局部的有序性，所以比较的次数会更少一些，相对前两种会更快</p>
<p>希尔排序：其实就是用步长控制的插入排序，希尔排序通过加大插入排序中元素之间的间隔，并在这些有间隔的元素中进行插入排序，从而让数据项可以大幅度移动，这样的方式可以使每次移动之后的数据离他们在最终序列中的位置相差不大，保证数据的基本有序，大大提升了排序速度，运算时间复杂度N*logN</p>
<p>快速排序：对一个队列，以他队尾的数据为基准值，先划分成两块数据，一块都大于这个值，一块小于这个值，然后对这两块进行同样的操作，这是最快的排序方法，运算时间复杂度N*logN</p>
<p>下面是代码：</p>
<p>&nbsp;public static void sort(int[] a)<br>&nbsp;{<br>&nbsp;&nbsp;long time1,time2;<br>&nbsp;&nbsp;int c;<br>&nbsp;&nbsp;time1=System.currentTimeMillis();<br>//&nbsp;&nbsp;/*冒泡排序*/<br>//&nbsp;&nbsp;for(int i=a.length-1;i&gt;1;i--)<br>//&nbsp;&nbsp;{<br>//&nbsp;&nbsp;&nbsp;for(int j=0;j&lt;i;j++)<br>//&nbsp;&nbsp;&nbsp;{<br>//<br>//&nbsp;&nbsp;&nbsp;&nbsp;if(a[j]&lt;a[j+1])<br>//&nbsp;&nbsp;&nbsp;&nbsp;{<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c=a[j];<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[j]=a[j+1];<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[j+1]=c;<br>//&nbsp;&nbsp;&nbsp;&nbsp;}<br>//&nbsp;&nbsp;&nbsp;}<br>//&nbsp;&nbsp;}<br>//&nbsp;&nbsp;/*选择排序*/<br>//&nbsp;&nbsp;int pos=0;<br>//&nbsp;&nbsp;for(int i=0;i&lt;a.length-2;i++)<br>//&nbsp;&nbsp;{<br>//&nbsp;&nbsp;&nbsp;for(int j=i;j&lt;a.length-1;j++)<br>//&nbsp;&nbsp;&nbsp;{<br>//&nbsp;&nbsp;&nbsp;&nbsp;if(a[pos]&lt;a[j+1])<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos=j+1;<br>//&nbsp;&nbsp;&nbsp;}<br>//&nbsp;&nbsp;&nbsp;c=a[i];<br>//&nbsp;&nbsp;&nbsp;a[i]=a[pos];<br>//&nbsp;&nbsp;&nbsp;a[pos]=c;<br>//&nbsp;&nbsp;&nbsp;pos=i+1;<br>//&nbsp;&nbsp;}<br>//&nbsp;&nbsp;/*插入排序*/<br>//&nbsp;&nbsp;for(int i=1;i&lt;a.length;i++)<br>//&nbsp;&nbsp;{<br>//&nbsp;&nbsp;&nbsp;c=a[i];<br>//&nbsp;&nbsp;&nbsp;int m=i-1;<br>//&nbsp;&nbsp;&nbsp;while(m&gt;=0&amp;&amp;a[m]&lt;c)<br>//&nbsp;&nbsp;&nbsp;{<br>//&nbsp;&nbsp;&nbsp;&nbsp;a[m+1]=a[m];<br>//&nbsp;&nbsp;&nbsp;&nbsp;m--;<br>//&nbsp;&nbsp;&nbsp;}<br>//&nbsp;&nbsp;&nbsp;a[m+1]=c;<br>//&nbsp;&nbsp;}<br>//&nbsp;&nbsp;/*希尔排序*/<br>//&nbsp;&nbsp;int h=1;<br>//&nbsp;&nbsp;int m=0;<br>//&nbsp;&nbsp;while(3*h+1&lt;a.length)<br>//&nbsp;&nbsp;&nbsp;h=3*h+1;<br>//&nbsp;&nbsp;while(h&gt;0)<br>//&nbsp;&nbsp;{<br>//&nbsp;&nbsp;&nbsp;for(int i=h;i&lt;a.length;i++)<br>//&nbsp;&nbsp;&nbsp;{<br>//&nbsp;&nbsp;&nbsp;&nbsp;c=a[i];<br>//&nbsp;&nbsp;&nbsp;&nbsp;m=i-h;<br>//&nbsp;&nbsp;&nbsp;&nbsp;while(m&gt;=0&amp;&amp;a[m]&lt;c)<br>//&nbsp;&nbsp;&nbsp;&nbsp;{<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[m+h]=a[m];<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m-=h;<br>//&nbsp;&nbsp;&nbsp;&nbsp;}<br>//&nbsp;&nbsp;&nbsp;&nbsp;a[m+h]=c;<br>//&nbsp;&nbsp;&nbsp;&nbsp;<br>//&nbsp;&nbsp;&nbsp;}<br>//&nbsp;&nbsp;&nbsp;h=(h-1)/3;<br>//&nbsp;&nbsp;}<br>&nbsp;&nbsp;/*快速排序*/<br>&nbsp;&nbsp;provide(a,0,a.length-1);<br>&nbsp;&nbsp;time2=System.currentTimeMillis();<br>&nbsp;&nbsp;System.out.println("time:"+(time2-time1));<br>&nbsp;}<br>&nbsp;/*递归调用划分*/<br>&nbsp;public static void provide(int[] a,int left,int right)<br>&nbsp;{<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;if(right&lt;=left)<br>&nbsp;&nbsp;&nbsp;&nbsp;return;<br>&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;/*设置基准点*/<br>&nbsp;&nbsp;&nbsp;&nbsp;int prov=a[right];<br>&nbsp;&nbsp;&nbsp;&nbsp;/*取得划分中断点*/<br>&nbsp;&nbsp;&nbsp;&nbsp;int par=partitionIt(a,left,right,prov);<br>&nbsp;&nbsp;&nbsp;&nbsp;/*对划分后的两边再次划分*/<br>&nbsp;&nbsp;&nbsp;&nbsp;provide(a,left,par-1);<br>&nbsp;&nbsp;&nbsp;&nbsp;provide(a,par+1,right);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;catch(Exception e)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;System.out.println("eer:"+left+"."+right);<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;/*划分算法*/<br>&nbsp;public static int partitionIt(int[] a,int left,int right,int prov)<br>&nbsp;{<br>&nbsp;&nbsp;/*设置左右端点的指针*/<br>&nbsp;&nbsp;int leftP=left-1;<br>&nbsp;&nbsp;int rightP=right;<br>&nbsp;&nbsp;int c;//用于交换的中间变量<br>&nbsp;&nbsp;/*当左右指针未相遇时继续操作*/<br>&nbsp;&nbsp;while(leftP&lt;rightP)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;/*当左指针的数据小于基准值时跳出*/<br>&nbsp;&nbsp;&nbsp;while(leftP&lt;a.length-1&amp;&amp;a[++leftP]&gt;prov)<br>&nbsp;&nbsp;&nbsp;&nbsp;;<br>&nbsp;&nbsp;&nbsp;/*当右指针的数据大于基准值时跳出*/<br>&nbsp;&nbsp;&nbsp;while(rightP&gt;leftP&amp;&amp;a[--rightP]&lt;prov)<br>&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;<br>&nbsp;&nbsp;&nbsp;/*左右指针都停下时交换数据*/<br>&nbsp;&nbsp;&nbsp;c=a[leftP];<br>&nbsp;&nbsp;&nbsp;a[leftP]=a[rightP];<br>&nbsp;&nbsp;&nbsp;a[rightP]=c;<br>&nbsp;&nbsp;}&nbsp;<br>&nbsp;&nbsp;/*划分结束，将基准点与指针的相遇点交换*/<br>&nbsp;&nbsp;c=a[rightP];<br>&nbsp;&nbsp;a[rightP]=a[right];<br>&nbsp;&nbsp;a[right]=c;&nbsp;<br>&nbsp;&nbsp;return leftP;<br>&nbsp;}</p>
<img src ="http://www.blogjava.net/mayu/aggbug/120488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mayu/" target="_blank">my</a> 2007-05-28 15:49 <a href="http://www.blogjava.net/mayu/articles/120488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>