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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 某次二面时,面试官问起Js排序问题,吾绞尽脑汁回答了几种,深感算法有很大的问题,所以总计一下! 排序算法说明 (1...
    流浪的先知阅读 1,208评论 0 4
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,769评论 0 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,915评论 18 139
  • 原博客 1.选择排序(Selection Sort): 选择最小元素,移动到首位置。 (1)算法描述和实现: 首先...
    Gitfan阅读 552评论 0 0
  • 一个叫欧维的男人决定去死
    xmxin_阅读 150评论 0 0