Radix sort, Counting sort, Bucket sort

突然发现自己对这三种排序算法一无所知。
他们是基于不比较类型的算法。
在特殊情况下,时间复杂度可以达到 O(n)

看下面三篇文章,讲得很好。

Radix sort:
https://en.wikipedia.org/wiki/Radix_sort

Counting sort:
http://www.geeksforgeeks.org/counting-sort/

Bucket sort:
http://www.geeksforgeeks.org/bucket-sort-2/

我自己写了下Radix sort, 他是基于counting sort的。

My code:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;

public class Solution {
    public void radixSort(int[] nums) {
        if (nums == null || nums.length <= 1) {
            return;
        }
        
        int max = getMax(nums);
        for (int i = 1; i <= max; i = i * 10) {
            countingSort(nums, nums.length, i);
        }
    }
    
    private int getMax(int[] nums) {
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < nums.length; i++) {
            max = Math.max(max, nums[i]);
        }
        
        return max;
    }
    
    private void countingSort(int[] nums, int n, int digit) {
        int[] counters = new int[10];
        int[] temp = new int[n];
        for (int i = 0; i < n; i++) {
            counters[(nums[i] / digit) % 10]++;
        }
        
        for (int i = 1; i < 10; i++) {
            counters[i] += counters[i - 1];
        }
        
        for (int i = n - 1; i >= 0; i--) {
            temp[counters[(nums[i] / digit) % 10] - 1] = nums[i];
            counters[(nums[i] / digit) % 10]--;
        }
        
        for (int i = 0; i < n; i++) {
            nums[i] = temp[i];
        }
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        int[] nums = new int[]{170, 45, 75, 90, 802, 24, 2, 66};
        test.radixSort(nums);
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "_");
        }
    }
}

这里有个细节是,counting sort 只能从右往左扫描。因为我们要维持稳定的排序。即,假设两个两位数,在按照第三位排序的时候,他们原来的顺序不能被破坏。

Anyway, Good luck, Richardo! — 09/01/2016

    原文作者:Richardo92
    原文地址: https://www.jianshu.com/p/d461a3f69499#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞