1. 程式人生 > >看動畫學演算法之:排序-count排序

看動畫學演算法之:排序-count排序

[toc] # 簡介 今天我們介紹一種不需要作比較就能排序的演算法:count排序。 count排序是一種空間換時間的演算法,我們藉助一個外部的count陣列來統計各個元素出現的次數,從而最終完成排序。 # count排序的例子 count排序有一定的限制,因為外部的count陣列長度是和原陣列的元素範圍是一致的,所以count排序一般只適合陣列中元素範圍比較小的情況。 我們舉一個0-9的元素的排序的例子:3,4,2,5,6,2,4,9,1,3,5。 先看一個動畫,看看是怎麼排序的: ![](https://img-blog.csdnimg.cn/20200709212450630.gif) count數組裡面存放的是從0到9這些元素出現的次數。 我們遍歷原始陣列,遇到相應的數字就給相應的count+1。 等所有的元素都count之後,再根據count陣列中的值還原排序過後的陣列。 # count排序的java實現 count排序很簡單,我們主要掌握下面兩個大的步驟: 1. 遍歷原始陣列,構建count陣列。 2. 根據count陣列中的count值,重新構建排序陣列。 ~~~java public class CountingSort { public void doCountingSort(int[] array){ int n = array.length; // 儲存排序過後的陣列 int output[] = new int[n]; // count陣列,用來儲存統計各個元素出現的次數 int count[] = new int[10]; for (int i=0; i<10; ++i) { count[i] = 0; } log.info("初始化count值:{}",count); // 將原始陣列中資料出現次數存入count陣列 for (int i=0; i 0){ output[j++]=i; } } log.info("構建output之後的output值:{}",output); //將排序後的陣列寫回原陣列 for (int i = 0; i=0; i--) { output[count[array[i]]-1] = array[i]; --count[array[i]]; } log.info("構建output之後的output值:{}",output); ~~~ 主要分為兩步: 第一步我們根據count中元素出現的次數計算對應元素第一次應該出現在output中的下標。這裡的下標是從右往左數的。 第二步根據count中的下標,構建排序後的陣列,插入一個之後,相應的count下標要減一。 ![](https://img-blog.csdnimg.cn/20200709223139978.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_30,color_8F8F8F,t_70) 可能不是很好理解,大家可以結合輸出結果反覆琢磨一下。 # count排序的時間複雜度 從上面的程式碼我們可以看到,count排序實際上只做了少量次數的遍歷。所以它的時間複雜度是O(n)。 本文的程式碼地址: [learn-algorithm](https://github.com/ddean2009/learn-algorithm/tree/master/sorting) >
本文已收錄於 [http://www.flydean.com/algorithm-count-sort/](http://www.flydean.com/algorithm-count-sort/) > > 最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現! > > 歡迎關注我的公眾號:「程式那些事」,懂技術,更