基数排序 | 指尖的舞客



基数排序 | 指尖的舞客

基数排序号称可以在O(n)的时间复杂度完成排序,其实所言非虚,只是真正的时间复杂度应该是O(kN),k指待排序列最大值的位数,同时不能遗漏的是基数排序需要O(N)的空间充当"桶"的角色。根据基数排序的排序的原理,可知它比较适合于正整数的排序,而对于负数或者浮点数,字符串等排序,需要将待排序列做一定得变换。这里主要是记录下如何使用基数排序来实现对正整数的排序,以此来阐述基数排序的原理。 根据按位比较的方向,可以将基数排序的实现分为两种,MSD(Most significant digital,从高到低)和LSD(Least significant digital,从低到高)。 首先写一个获取指定位的辅助函数 private static final int radix = 10; private static int getDigit(int num, int d){ int[] rd = new int[]{1,1,10,100,1000}; return (num / rd[d])%10; } 先实现MSD算法,也就是从高到低位的比较顺序。 public static void msdRadixSort(int[] nums, int start, int end, int d){ if(nums == null || nums.length < 2) return; int len = end - start + 1; int[] bucket = new int[len]; int[] count = new int[radix+1]; int i = 0; int j = 0; for(i=start; i<=end; i++){ count[getDigit(nums[i], d)]++; } for(i=1; i<=radix; i++){ count[i] += count[i-1]; } for(i = end; i>=start; i--){ j = getDigit(nums[i], d); bucket[count[j] - 1] = nums[i]; count[j]--; } for(i=start, j=0; i<=end; i++,j++) nums[i] = bucket[j]; for(i=0; i

Read full article from 基数排序 | 指尖的舞客


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts