A post to review RadixSort. The idea is to
Code
class RadixSort(): def sort(self, nums): max_num = max(nums) exp = 1 while max_num / exp: nums = self.count_sort(nums, exp) exp = exp * 10 return nums def count_sort(self, nums, exp): # how many numbers have 0~9 for the current position digit_counts = [0] * 10 for n in nums: digit_counts[(n / exp) % 10] += 1 # accumulate counts for i in xrange(1, 10): digit_counts[i] += digit_counts[i-1] outputs = [0] * len(nums) # traverse from tail to head because we want to keep original order # of numbers having same digit on the current position for n in nums[::-1]: outputs[digit_counts[(n / exp) % 10] - 1] = n digit_counts[(n / exp) % 10] -= 1 return outputs if __name__ == "__main__": s = RadixSort() print s.sort([4,3,1,20,100])
Idea
Traverse digits: for each digit, count how many numbers have 0~9 on that digit and put the counts in a bucket (digit_count
). Then, convert the bucket into accumulated counts. For example, if digit_count[0]=3
and digit_count[1]=4
, then after the conversion, digit_count[1]=7
because we know numbers with 1 on that digit will be put in the position between `[3, 7)` (position starts from 0).
Then we can reorder the numbers. We reorder from right to left (line 27~29) because we want to keep the original order of numbers which have the same digit on the current digit position.
If a number at most uses $latex d$ digits, radix sort uses time $latex O(d(n+d))$ and space $latex O(n+d)$.
Reference: http://www.geeksforgeeks.org/radix-sort/