浅谈算法和数据结构


    <div class="post">
        <h1 class="postTitle">
            <a id="cb_post_title_url" class="postTitle2" href="https://www.cnblogs.com/huojg-21442/p/7246518.html">浅谈Java数据结构和算法</a>
        </h1>
        <div class="clear"></div>
        <div class="postBody">
            <div id="cnblogs_post_body" class="blogpost-body"><p>今天的突然看集合底层的时候发现了好多算法和数据结构。再次就比较一下和汇总一下。</p>
<p>数据结构分类:线性结构和非线性结构</p>
<p>问题一:</p>
<p>什么是线性和非线性;</p>
<p>我个人的理解是:数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构;</p>
<p>线性结构包括:数组,链表,队列,栈;</p>
<p>非线性结构包括:树,图,表;</p>
<p>详解:</p>
<p>一.线性结构</p>
<p>1.数组</p>
<p>特点:我们都知道数组中的元素在内存中连续存储的,可以根据是下标快速访问元素,因此,查询速度很快,然而插入和删除时,需要对元素移动空间,比较慢。</p>
<p>数组使用场景:频繁查询,很少增加和删除的情况。</p>
<p>2.链表</p>
<p>特点:元素可以不连续内存中,是以索引将数据联系起来的,当查询元素的时候需要从头开始查询,所以效率比较低,然而添加和删除的只需要修改索引就可以了</p>
<p>使用场景:少查询,需要频繁的插入或删除情况</p>
<p>3.队列</p>
<p>特点:先进先出,</p>
<p>使用场景:多线程阻塞队列管理非常有用</p>
<p>4.栈</p>
<p>特点:先进后出,就像一个箱子,</p>
<p>使用场景:实现递归以及表示式</p>
<p>5.数组与链表的区别</p>
<p>数组连续,链表不连续(从数据存储形式来说)</p>
<p>数组内存静态分配,链表动态分配</p>
<p>数组查询复杂度0(1),链表查询复杂度O(n)</p>
<p>数组添加或删除,复杂度o(n),链表添加删除,复杂度O(1)</p>
<p>数组从栈中分配内存。链表从堆中分配内存。</p>
<p>&nbsp;</p>
<p>二。算法分类:</p>
<p class="p0">1)插入排序(直接插入排序、希尔排序)&nbsp;</p>
<p class="p0">2)交换排序(冒泡排序、快速排序)&nbsp;</p>
<p class="p0">3)选择排序(直接选择排序、堆排序)&nbsp;</p>
<p class="p0">4)归并排序&nbsp;</p>
<p class="p0">5)分配排序(基数排序)</p>
<p class="p0">所需辅助空间最多:归并排序&nbsp;</p>
<p class="p0">所需辅助空间最少:堆排序&nbsp;</p>
<p class="p0">平均速度最快:快速排序&nbsp;</p>
<p class="p0">不稳定:快速排序,希尔排序,堆排序。&nbsp;</p>
<p class="p0">&nbsp;1.直接插入排序&nbsp;</p>
<p class="p0">(1)基本思想:在要排序的一组数中,假设前面(n-1)[n&gt;=2]&nbsp;个数已经是排&nbsp;</p>
<p class="p0">好顺序的,现在要把第n&nbsp;个数插到前面的有序数中,使得这&nbsp;n个数&nbsp;</p>
<p class="p0">也是排好顺序的。如此反复循环,直到全部排好顺序。&nbsp;</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #008000">/**</span><span style="color: #008000">
     * 插入排序法
     *  
     * </span><span style="color: #808080">@param</span><span style="color: #008000"> datas
     </span><span style="color: #008000">*/</span>  
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span>[] sortInsert(<span style="color: #0000ff">int</span><span style="color: #000000">[] datas) {  
        </span><span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 1; i &lt; datas.length; i++<span style="color: #000000">) {  
            </span><span style="color: #0000ff">int</span> j = i - 1<span style="color: #000000">;  
            AlgorithmUtil.temp </span>=<span style="color: #000000"> datas[i];  
            </span><span style="color: #0000ff">for</span> (; j &gt;= 0 &amp;&amp; AlgorithmUtil.temp &lt; datas[j]; j--<span style="color: #000000">) {  
                datas[j </span>+ 1] =<span style="color: #000000"> datas[j];  
            }  
            datas[j </span>+ 1] =<span style="color: #000000"> AlgorithmUtil.temp;  
        }  
        </span><span style="color: #0000ff">return</span><span style="color: #000000"> datas;  
    }  </span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>&nbsp;</p>
<p class="p0">2.简单选择排序&nbsp;</p>
<p class="p0">(1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;&nbsp;</p>
<p class="p0">然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一</p>
<p class="p0">个数比较为止。&nbsp;</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre> <span style="color: #008000">/**</span><span style="color: #008000">
     * 选择排序
     *  
     * </span><span style="color: #808080">@return</span>
     <span style="color: #008000">*/</span>  
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span>[] sortSelect(<span style="color: #0000ff">int</span><span style="color: #000000">[] datas) {  
        </span><span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i &lt; datas.length; i++<span style="color: #000000">) {  
            </span><span style="color: #0000ff">int</span> index =<span style="color: #000000"> i;  
            </span><span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> j = i + 1; j &lt; datas.length; j++<span style="color: #000000">) {  
                </span><span style="color: #0000ff">if</span> (datas[j] &lt;<span style="color: #000000"> datas[index])  
                    index </span>=<span style="color: #000000"> j;  
            }  
            </span><span style="color: #0000ff">if</span> (i !=<span style="color: #000000"> index)  
                AlgorithmUtil.swap(datas, i, index);  
        }  
        </span><span style="color: #0000ff">return</span><span style="color: #000000"> datas;  
    }  </span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>3.冒泡排序</p>
<p class="p0">(1)基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对</p>
<p class="p0">相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的</p>
<p class="p0">数比较后发现它们的排序与排序要求相反时,就将它们互换。</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre> <span style="color: #008000">/**</span><span style="color: #008000">
     * 冒泡排序
     *  
     * </span><span style="color: #808080">@return</span>
     <span style="color: #008000">*/</span>  
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span>[] sortBubble(<span style="color: #0000ff">int</span><span style="color: #000000">[] datas) {  
        </span><span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i &lt; datas.length - 1; i++<span style="color: #000000">) {  
            </span><span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> j = 0; j &lt; datas.length - 1 - i; j++<span style="color: #000000">) {  
                </span><span style="color: #0000ff">if</span> (datas[j] &gt; datas[j + 1<span style="color: #000000">])  
                    AlgorithmUtil.swap(datas, j, j </span>+ 1<span style="color: #000000">);  
            }  
        }  
        </span><span style="color: #0000ff">return</span><span style="color: #000000"> datas;  
    }  </span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>4.快速排序</p>
<p class="p0">(1)基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,</p>
<p class="p0">将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其</p>
<p class="p0">排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre>  <span style="color: #008000">/**</span><span style="color: #008000">
     * 快速排序;分割数组
     *  
     * </span><span style="color: #808080">@param</span><span style="color: #008000"> datas
     </span><span style="color: #008000">*/</span>  
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> QuickPartition(<span style="color: #0000ff">int</span>[] datas, <span style="color: #0000ff">int</span> left, <span style="color: #0000ff">int</span><span style="color: #000000"> right) {  
        </span><span style="color: #0000ff">int</span> pivot =<span style="color: #000000"> datas[left];  
        </span><span style="color: #0000ff">while</span> (left &lt;<span style="color: #000000"> right) {  
            </span><span style="color: #0000ff">while</span> (left &lt; right &amp;&amp; datas[right] &gt;=<span style="color: #000000"> pivot)  
                </span>--<span style="color: #000000">right;  
            datas[left] </span>= datas[right]; <span style="color: #008000">//</span><span style="color: #008000"> 将比枢轴小的元素移到低端,此时right位相当于空,等待低位比pivotkey大的数补上  </span>
            <span style="color: #0000ff">while</span> (left &lt; right &amp;&amp; datas[left] &lt;=<span style="color: #000000"> pivot)  
                </span>++<span style="color: #000000">left;  
            datas[right] </span>= datas[left]; <span style="color: #008000">//</span><span style="color: #008000"> 将比枢轴大的元素移到高端,此时left位相当于空,等待高位比pivotkey小的数补上  </span>
<span style="color: #000000">        }  
        datas[left] </span>= pivot; <span style="color: #008000">//</span><span style="color: #008000"> 当left == right,完成一趟快速排序,此时left位相当于空,等待pivotkey补上  </span>
        <span style="color: #0000ff">return</span><span style="color: #000000"> left;  
    }  
 
    </span><span style="color: #008000">/**</span><span style="color: #008000">
     * 快速排序;递归返回数组
     *  
     * </span><span style="color: #808080">@param</span><span style="color: #008000"> datas
     </span><span style="color: #008000">*/</span>  
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span>[] sortQuick(<span style="color: #0000ff">int</span>[] datas, <span style="color: #0000ff">int</span> left, <span style="color: #0000ff">int</span><span style="color: #000000"> right) {  
        </span><span style="color: #0000ff">if</span> (left &lt;<span style="color: #000000"> right) {  
            </span><span style="color: #0000ff">int</span> data =<span style="color: #000000"> QuickPartition(datas, left, right);  
            sortQuick(datas, left, data </span>- 1<span style="color: #000000">);  
            sortQuick(datas, data </span>+ 1<span style="color: #000000">, right);  
        }  
        </span><span style="color: #0000ff">return</span><span style="color: #000000"> datas;  
    }  </span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>&nbsp;</p>
<p>1.冒泡算法,2.选择算法,3.快速算法。4.插入算法,5.希尔算法,6.堆算法</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> AlgorithmUtil {  

</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> temp,index = 0<span style="color: #000000">;  

</span><span style="color: #008000">/**</span><span style="color: #008000">
 * 临时值交换
 *  
 * </span><span style="color: #808080">@param</span><span style="color: #008000"> datas
 *            数组
 * </span><span style="color: #808080">@param</span><span style="color: #008000"> i
 * </span><span style="color: #808080">@param</span><span style="color: #008000"> j
 </span><span style="color: #008000">*/</span>  
<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> swap(<span style="color: #0000ff">int</span>[] datas, <span style="color: #0000ff">int</span> i, <span style="color: #0000ff">int</span><span style="color: #000000"> j) {  
    temp </span>=<span style="color: #000000"> datas[i];  
    datas[i] </span>=<span style="color: #000000"> datas[j];  
    datas[j] </span>=<span style="color: #000000"> temp;  
}  

</span><span style="color: #008000">/**</span><span style="color: #008000">
 * 扩充数组长度
 *  
 * </span><span style="color: #808080">@param</span><span style="color: #008000"> datas
 * </span><span style="color: #808080">@param</span><span style="color: #008000"> value
 * </span><span style="color: #808080">@return</span>
 <span style="color: #008000">*/</span>  
<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span>[] expandArray(<span style="color: #0000ff">int</span>[] datas, <span style="color: #0000ff">int</span><span style="color: #000000"> value) {  
    </span><span style="color: #0000ff">if</span> (datas.length &lt;=<span style="color: #000000"> index) {  
        </span><span style="color: #0000ff">int</span>[] arrays = <span style="color: #0000ff">new</span> <span style="color: #0000ff">int</span>[datas.length * 2<span style="color: #000000">];  
        System.arraycopy(datas, </span>0, arrays, 0<span style="color: #000000">, datas.length);  
        datas </span>=<span style="color: #000000"> arrays;  
    }  
    datas[index] </span>=<span style="color: #000000"> value;  
    index</span>++<span style="color: #000000">;  
    </span><span style="color: #0000ff">return</span><span style="color: #000000"> datas;  
}  
}  </span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>&nbsp;</p>
<p>目前记住。会冒泡。插入。选择。快速。算法。</p>
<p>&nbsp;</p></div><div id="MySignature"></div>
<div class="clear"></div>
<div id="blog_post_info_block">
<div id="BlogPostCategory"></div>
<div id="EntryTag"></div>
<div id="blog_post_info"><div id="green_channel">
        <a href="javascript:void(0);" id="green_channel_digg" οnclick="DiggIt(7246518,cb_blogId,1);green_channel_success(this,'谢谢推荐!');">好文要顶</a>
            <a id="green_channel_follow" οnclick="follow('56e6147b-191f-e711-9fc1-ac853d9f53cc');" href="javascript:void(0);">关注我</a>
    <a id="green_channel_favorite" οnclick="AddToWz(cb_entryId);return false;" href="javascript:void(0);">收藏该文</a>
    <a id="green_channel_weibo" href="javascript:void(0);" title="分享至新浪微博" οnclick="ShareToTsina()"><img src="//common.cnblogs.com/images/icon_weibo_24.png" alt=""></a>
    <a id="green_channel_wechat" href="javascript:void(0);" title="分享至微信" οnclick="shareOnWechat()"><img src="//common.cnblogs.com/images/wechat.png" alt=""></a>
</div>
<div id="author_profile">
    <div id="author_profile_info" class="author_profile_info">
            <a href="http://home.cnblogs.com/u/huojg-21442/" target="_blank"><img src="//pic.cnblogs.com/face/1144956/20170605101726.png" class="author_avatar" alt=""></a>
        <div id="author_profile_detail" class="author_profile_info">
            <a href="http://home.cnblogs.com/u/huojg-21442/">技术专家</a><br>
            <a href="http://home.cnblogs.com/u/huojg-21442/followees">关注 - 0</a><br>
            <a href="http://home.cnblogs.com/u/huojg-21442/followers">粉丝 - 11</a>
        </div>
    </div>
    <div class="clear"></div>
    <div id="author_profile_honor"></div>
    <div id="author_profile_follow">
                <a href="javascript:void(0);" οnclick="follow('56e6147b-191f-e711-9fc1-ac853d9f53cc');return false;">+加关注</a>
    </div>
</div>
<div id="div_digg">
    <div class="diggit" οnclick="votePost(7246518,'Digg')">
        <span class="diggnum" id="digg_count">0</span>
    </div>
    <div class="buryit" οnclick="votePost(7246518,'Bury')">
        <span class="burynum" id="bury_count">0</span>
    </div>
    <div class="clear"></div>
    <div class="diggword" id="digg_tips">
    </div>
</div>
<script type="text/javascript">
    currentDiggType = 0;
</script></div>
<div class="clear"></div>
<div id="post_next_prev"><a href="https://www.cnblogs.com/huojg-21442/p/7239846.html" class="p_n_p_prefix">« </a> 上一篇:<a href="https://www.cnblogs.com/huojg-21442/p/7239846.html" title="发布于2017-07-26 15:14">java注解的自定义和使用</a><br><a href="https://www.cnblogs.com/huojg-21442/p/7246605.html" class="p_n_p_prefix">» </a> 下一篇:<a href="https://www.cnblogs.com/huojg-21442/p/7246605.html" title="发布于2017-07-27 19:02">java集合</a><br></div>
</div>


        </div>
        <div class="postDesc">posted @ <span id="post-date">2017-07-27 18:39</span> <a href="https://www.cnblogs.com/huojg-21442/">技术专家</a> 阅读(<span id="post_view_count">7026</span>) 评论(<span id="post_comment_count">1</span>)  <a href="https://i.cnblogs.com/EditPosts.aspx?postid=7246518" rel="nofollow">编辑</a> <a href="#" οnclick="AddToWz(7246518);return false;">收藏</a></div>
    </div>
    <script type="text/javascript">var allowComments=true,cb_blogId=359329,cb_entryId=7246518,cb_blogApp=currentBlogApp,cb_blogUserGuid='56e6147b-191f-e711-9fc1-ac853d9f53cc',cb_entryCreatedDate='2017/7/27 18:39:00';loadViewCount(cb_entryId);var cb_postType=1;</script>
    

发布了44 篇原创文章 · 获赞 20 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/u013134722/article/details/82108593