基数排序(java实现)复杂性

时间:2015-04-26 21:23:45

标签: java sorting time-complexity radix-sort

这是我的第一个问题,所以我希望我没有违反任何规则。我终于设法为Radix排序算法编写了代码,但我想知道我是否做错了。是什么让我觉得我的算法看起来很复杂O(n ^ 3),但Radix Sort是臭名昭着的O(k.n)算法。我计算算法的复杂性是错误的,还是我写错了代码?

private static void radixSort(int[] A){
    ArrayList<Integer>[] bucket = new ArrayList[10];
    int maxNumberOfDigits = 0;
    for(int number : A){
        if(numberOfDigitsIn(number) > maxNumberOfDigits) maxNumberOfDigits = numberOfDigitsIn(number);
    }
    for(int c=0; c<bucket.length; c++){
        bucket[c] = new ArrayList<Integer>();
    }
    int i = 0;
    int digit;
    int j;
    while(i < maxNumberOfDigits){
        for(j = 0; j<A.length; j++){
            digit = getDigit(A[j], i);
            bucket[digit].add(A[j]);
        }

        int index = 0;
        for(int z = 0; z<bucket.length; z++){
            for (int k=0; k<bucket[z].size(); k++){
                A[index] = bucket[z].get(k);
                index += 1;

            }
            bucket[z].clear();
        }
        i += 1;
    }
}

方法getDigit()和numberOfDigitsIn()具有恒定时间。

1 个答案:

答案 0 :(得分:0)

    for(int z = 0; z<bucket.length; z++){
        for (int k=0; k<bucket[z].size(); k++){

这里至关重要的是所有铲斗尺寸的总和将等于n,因此这些循环组合仅取O(n)。 j上的循环取O(n),i上的while循环将运行maxNumberOfDigits迭代,并且该数字表示您所描述的O(kn)运行时中的k。所以总数实际上是O(kn)。