Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/Geolage/blog
Browse files Browse the repository at this point in the history
  • Loading branch information
Geolage committed Oct 2, 2017
2 parents 5270623 + 2d26619 commit 8f7f40d
Show file tree
Hide file tree
Showing 50 changed files with 716 additions and 45 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

img/Thumbs.db
48 changes: 48 additions & 0 deletions 2017/09/25/选择排序法的实现与分析/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<!DOCTYPE html><html lang="zh-Hans"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><title>选择排序法的实现与分析 - Geolage's Blog</title><link rel="stylesheet" href="/blog/css/index.css"><link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css"><script>var GLOBAL = {
root: '/blog/',
algolia: undefined,
copy: {
success: '复制成功',
error: '复制错误',
noSupport: '浏览器不支持'
}
} </script><link rel="icon" href="/blog/favicon.ico"></head><body><canvas class="fireworks"></canvas><i class="fa fa-bars" id="toggle-sidebar" aria-hidden="true"></i><div id="sidebar"><div class="toggle-sidebar-info text-center"><span data-toggle="切换文章详情">切换站点概览</span><hr></div><div class="sidebar-toc"><div class="sidebar-toc__title">目录</div><div class="sidebar-toc__progress"><span class="progress-notice">你已经读了</span><span class="progress-num">0</span><span class="progress-percentage">%</span><div class="sidebar-toc__progress-bar"></div></div><div class="sidebar-toc__content"></div></div><div class="author-info hide"><div class="author-info__avatar text-center"><img src="/blog//img/avatar.jpg"></div><div class="author-info__name text-center">Geolage Wu</div><div class="author-info__description text-center"></div><hr><div class="author-info-articles"><a class="author-info-articles__archives article-meta" href="/blog/archives"><span class="pull-left">文章</span><span class="pull-right">8</span></a><a class="author-info-articles__tags article-meta" href="/blog/tags"><span class="pull-left">标签</span><span class="pull-right">23</span></a><a class="author-info-articles__categories article-meta" href="/blog/categories"><span class="pull-left">分类</span><span class="pull-right">9</span></a></div><hr><div class="author-info-links"><div class="author-info-links__title text-center">相关链接</div><a class="author-info-links__name text-center" href="https://www.higherloft.com" target="_blank">HigherLoft</a></div></div></div><div id="content-outer"><div id="top-container" style="background-image: url(/blog/img/top2.jpg);"><div id="page-header"><span class="pull-left"> <a id="site-name" href="/blog/">Geolage's Blog</a></span><i class="fa fa-bars toggle-menu pull-right" aria-hidden="true"></i><span class="pull-right menus"><a class="site-page" href="/blog/">主页</a><a class="site-page" href="/blog/archives">文章</a><a class="site-page" href="/blog/tags">标签</a><a class="site-page" href="/blog/categories">分类</a></span></div><div id="post-info"><div id="post-title">选择排序法的实现与分析</div><div id="post-meta"><time class="post-meta__date"><i class="fa fa-calendar" aria-hidden="true"></i> 2017-09-25 </time><span class="post-meta__separator"> | </span><i class="fa fa-inbox" aria-hidden="true"> </i><a class="post-meta__categories" href="/blog/categories/算法/"> 算法 </a><i class="fa fa-angle-right" aria-hidden="true"> </i><i class="fa fa-inbox" aria-hidden="true"> </i><a class="post-meta__categories" href="/blog/categories/算法/选择排序/"> 选择排序 </a><span class="post-meta__separator"> | </span><i class="fa fa-comment-o" aria-hidden="true"> </i><a href="/blog/2017/09/25/选择排序法的实现与分析/#disqus_thread"><span class="disqus-comment-count" data-disqus-identifier="2017/09/25/选择排序法的实现与分析/"></span></a></div></div></div><div class="layout" id="content-inner"><article id="post"><div id="post-content"><p><strong>什么是选择排序法?</strong></p>
<blockquote>
<p>选择排序,就是把要排序的含有N个元素的一组记录进行分趟比较,在每一趟的记录(<font color="red">无序序列</font>)中选择最小(或最大)的值作为 <font color="red">有序序列 </font>中第 I(I=1,2,…,N-1)个记录。通过比较交换后得到的有序序列即为选择排序的结果。</p>
</blockquote>
<p>举个“栗子”,从小到大选择排序,有一组数<strong>A= <font color="red">{55,60,13,23,19,8}</font></strong> <br><strong><font color="red">1 </font>趟比较:</strong><br>原数列就是一组无序序列,经过比较,最后一个元素“<strong>8</strong>”最小,故将其跟第1个元素“<strong>55</strong>”交换,作为有序序列 <font color="red"><strong>{8}</strong> </font>的第1个记录。<br><strong><font color="red">2 </font>趟比较:</strong><br>从无序序列 <font color="red"><strong>{60,13,23,19,55}</strong> </font>中比较得出元素“<strong>13</strong>”最小,交换后得到有序序列 <font color="red"><strong>{8,13}</strong> </font><br>如此类推,得出最后的有序序列 <font color="red"><strong>{8,13,19,23,55,60}</strong> </font>即为选择排序结果。</p>
<hr>
<p><strong>我们来看看代码(<em>在 Java 环境运行</em>):</strong></p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">import</span> javax.swing.JOptionPane;</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">SelectSort</span> </span>&#123; <span class="comment">//用选择排序法由小到大排序</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</div><div class="line"> <span class="keyword">int</span> count = <span class="number">0</span>,count_swap=<span class="number">0</span>, j,ins, index, temp, min;</div><div class="line"> String s=JOptionPane.showInputDialog(<span class="string">"请输入数组个数:"</span>);</div><div class="line"> ins=Integer.valueOf(s);</div><div class="line"> <span class="keyword">int</span> []arr=<span class="keyword">new</span> <span class="keyword">int</span>[ins];</div><div class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> num=<span class="number">0</span>;num&lt;arr.length;num++) &#123;</div><div class="line"> arr[num]=Integer.valueOf(JOptionPane.showInputDialog(<span class="string">"请输入第"</span>+(num+<span class="number">1</span>)+<span class="string">"个数:"</span>));</div><div class="line"> &#125;</div><div class="line"> System.out.println(<span class="string">"输入数组:"</span>);</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> a : arr) &#123;</div><div class="line"> System.out.print(a + <span class="string">" "</span>);</div><div class="line"> &#125;</div><div class="line"> System.out.println();</div><div class="line"> System.out.println(<span class="string">"执行过程:"</span>);</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; arr.length - <span class="number">1</span>; i++) &#123;</div><div class="line"> min = arr[i];</div><div class="line"> index = i;</div><div class="line"> <span class="keyword">for</span> (j = i + <span class="number">1</span>; j &lt; arr.length; j++) &#123;</div><div class="line"> <span class="keyword">if</span> (arr[j] &lt; min) &#123;</div><div class="line"> min = arr[j];</div><div class="line"> index = j;</div><div class="line"> &#125;</div><div class="line"> count += <span class="number">1</span>;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">if</span> (index != i) &#123;</div><div class="line"> temp = arr[i];</div><div class="line"> arr[i] = arr[index];</div><div class="line"> arr[index] = temp;</div><div class="line"> count_swap+=<span class="number">1</span>;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> a : arr) &#123;</div><div class="line"> System.out.print(a + <span class="string">" "</span>);</div><div class="line"> &#125;</div><div class="line"> System.out.print(<span class="string">" 第"</span>+count_swap + <span class="string">"次交换"</span>);</div><div class="line"> System.out.println();</div><div class="line"> &#125;</div><div class="line"> &#125;</div><div class="line"> <span class="keyword">if</span>(count_swap==<span class="number">0</span>) &#123;</div><div class="line"> System.out.println(<span class="string">"已是排序数组,无需执行"</span>);</div><div class="line"> &#125;</div><div class="line"> System.out.println(<span class="string">"排序结果:"</span>);</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> k : arr) &#123;</div><div class="line"> System.out.print(k + <span class="string">" "</span>);</div><div class="line"> &#125;</div><div class="line"> System.out.print(<span class="string">" "</span> + <span class="string">"共交换"</span> + count_swap + <span class="string">"次"</span>+<span class="string">","</span> + <span class="string">"共比较"</span> + count + <span class="string">"次"</span>);</div><div class="line"> &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<font size:24=""><strong>运行结果:</strong> </font>

<blockquote>
<p>输入数组: 55 60 13 23 19 8</p>
<p>执行过程: 8 60 13 23 19 55 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第1次交换<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8 13 60 23 19 55 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第2次交换<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8 13 19 23 60 55 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第3次交换 </p>
<p>排序结果:&nbsp;&nbsp;&nbsp; 8 13 19 23 55 60 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;共交换4次,共比较15次</p>
</blockquote>
<hr>
<p><strong>算法分析:</strong></p>
<p>首先将整个数组分别划分为以第1个、第2个…第n-1个数开头到最后一个数的比较区域,共有<strong>n-1</strong>个。接着在每个比较区域里找出<strong>最小值</strong>,若最小值的位置<strong><font color="red">不在</font>比较区域之首</strong>,则<strong>将其第1个数和最小值交换</strong>;若无,则不交换。在含有x个数的比较区域中,必定涉及x-1次比较,<strong>次数与最小值出现的位置<font color="red">无关</font></strong></p>
<p>接下来,记录分别为<strong>5-10</strong>个元素的数组,做进一步分析:</p>
<p><img src="http://img.blog.csdn.net/20170316203926038?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb29veW91/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="记录图"></p>
<hr>
<p><strong>由统计数据可知:</strong> </p>
<ol>
<li><p>对n个不同随即序列的数进行选择排序,比较次数是恒定的,与原数组排列顺序无关。<strong>n越大,比较次数越多,规模越大</strong>。通过记录不难发现,存在这种关系:比较次数 <font color="red"><strong>c=n(n–1)/2, (n&gt;0)</strong> </font></p>
</li>
<li><p>交换次数由原数组的有序程度决定。<strong>有序程度越高,交换次数越少</strong></p>
</li>
<li><p>多次测试总结得出,运行结果是否与分析结果一致。</p>
</li>
</ol>
<p>如有不对的地方,欢迎指正,谢谢!</p>
</div><div class="post-copyright"><div class="post-copyright__author"><span class="post-copyright-meta">文章作者: </span><span class="post-copyright-info">Geolage Wu</span></div><div class="post-copyright__type"><span class="post-copyright-meta">文章链接: </span><span class="post-copyright-info">https://geolage.github.io/blog/2017/09/25/选择排序法的实现与分析/</span></div><div class="post-copyright__notice"><span class="post-copyright-meta">版权声明: </span><span class="post-copyright-info">本博客所有文章除特别声明外,均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/3.0/" target="_blank">CC BY-NC-SA 3.0</a> 许可协议。转载请注明出处!</span></div></div><div class="post-meta__tag-list"><a class="post-meta__tags" href="/blog/tags/算法/">算法</a><a class="post-meta__tags" href="/blog/tags/选择排序法/">选择排序法</a></div></article><nav id="pagination"><div class="prev-post pull-left"><a href="/blog/2017/09/26/MarkDown语法与使用指南/"><i class="fa fa-chevron-left"> </i><span>MarkDown语法与使用指南</span></a></div></nav><div id="disqus_thread"></div><script>var disqus_config = function () {
this.page.url = 'https://geolage.github.io/blog/2017/09/25/选择排序法的实现与分析/';
this.page.identifier = '2017/09/25/选择排序法的实现与分析/';
this.page.title = '选择排序法的实现与分析';
}
var d = document, s = d.createElement('script');
s.src = "https://geolage.disqus.com/embed.js";
s.setAttribute('data-timestamp', '' + +new Date());
(d.head || d.body).appendChild(s);</script><script id="dsq-count-src" src="https://geolage.disqus.com/count.js" async></script></div></div><footer><div class="layout" id="footer"><div class="copyright">©2014 - 2017 By Geolage Wu</div><div class="busuanzi"><script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script><span id="busuanzi_container_page_pv"><i class="fa fa-file-o"></i><span id="busuanzi_value_page_pv"></span><span></span></span></div></div></footer><i class="fa fa-arrow-up" id="go-up" aria-hidden="true"></i><script src="/blog/js/third-party/anime.min.js"></script><script src="/blog/js/third-party/jquery.min.js"></script><script src="/blog/js/third-party/jquery.fancybox.min.js"></script><script src="/blog/js/third-party/velocity.min.js"></script><script src="/blog/js/third-party/velocity.ui.min.js"></script><script src="/blog/js/utils.js"></script><script src="/blog/js/fancybox.js"></script><script src="/blog/js/sidebar.js"></script><script src="/blog/js/copy.js"></script><script src="/blog/js/fireworks.js"></script><script src="/blog/js/transition.js"></script><script src="/blog/js/scroll.js"></script><script src="/blog/js/head.js"></script><script src="/blog/js/main.js"></script></body></html>
Loading

0 comments on commit 8f7f40d

Please sign in to comment.