When should we use Radix sort?

前端 未结 11 1840
孤街浪徒
孤街浪徒 2021-01-30 16:27

It seems Radix sort has a very good average case performance, i.e. O(kN): http://en.wikipedia.org/wiki/Radix_sort

Yet it seems like most people are still using

11条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-01-30 17:03

    when n > 128, we should use RadixSort

    when sort int32s, I choose radix 256, so k = log(256, 2^32) = 4, which is significant smaller than log(2, n)

    and in my test, radix sort is 7 times faster than quicksort in the best case.

    public class RadixSort {
        private static final int radix=256, shifts[]={8,16,24}, mask=radix-1;
        private final int bar[]=new int[radix];
        private int s[] = new int[65536];//不使用额外的数组t,提高cpu的cache命中率
    
        public void ensureSort(int len){
            if(s.length < len)
                s = new int[len];
        }   
    
        public void sort(int[] a){
            int n=a.length;
            ensureSort(n);
            for(int i=0;i>8)&mask]++;
            for(int i=1;i=0;i--)a[--bar[(s[i]>>8)&mask]]=s[i];//同一个桶内的元素,低位已排序,而放入t中时是从t的大下标向小下标放入的,所以应该逆序遍历s[i]来保证原有的顺序不变
    
            for(int i=0;i>16)&mask]++;
            for(int i=1;i=0;i--)s[--bar[(a[i]>>16)&mask]]=a[i];//同一个桶内的元素,低位已排序,而放入t中时是从t的大下标向小下标放入的,所以应该逆序遍历s[i]来保证原有的顺序不变
    
            for(int i=0;i>24)&mask]++;
            for(int i=129;i=0;i--)a[--bar[(s[i]>>24)&mask]]=s[i];//同一个桶内的元素,低位已排序,而放入t中时是从t的大下标向小下标放入的,所以应该逆序遍历s[i]来保证原有的顺序不变      
        }
    }
    

提交回复
热议问题