微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

给定一个非负整数数组,展示如何在 Java 中使用计数排序和基数排序在 O(n) 时间内对数组进行排序

如何解决给定一个非负整数数组,展示如何在 Java 中使用计数排序和基数排序在 O(n) 时间内对数组进行排序

给定一个非负整数数组,其中不同的整数可能有不同的位数,但数组中所有整数的总位数为 n。展示如何在 O(n) 时间内对数组进行排序。为了解决这个问题,我们将一个整数表示为一个字节数组。每个字节代表一个数字(基数为 128)。数组中索引为 0 的字节表示最低有效字节。也就是说,如果A的长度为3,A[0] = 6,A[1] = 7,A[2] = 8,则A代表数字6 × 1280 + 7 × 1281 + 8 × 1283.

以下代码是我目前所拥有的,它没有产生正确的输出

private static void problem(byte[][] arr)
{ 
    // Counting Sort
    int[] count = new int[128];
    int ind = 0;
    for(int i =0; i < arr.length; i++)
    {
        count[arr[i][ind]]++;
    }
    int k = 0;
    for(int i =0 ; i < count.length; i++)
    {
        for(int j = 0; j < count[i]; j++)
            arr[k++][k++] = (byte) i;
    }
  
    //Radix Sort
    int max = arr[0][0];
    for(int i = 1; i < arr.length; i++)
    {
        if(arr[i][i] > max)
            max = arr[i][i];
    }
    int place = 1;
    int digits = (int) (Math.log10(max) + 1);
    int[] free = new int[10];
    int[] sort = new int[arr.length];
    while(digits-- > 0)
    {
        for(int i =0; i < arr.length; i++)
        {
            int digit = (arr[i][i] / place) % 10;
            free[digit]++;
            for(i = 1; i < 10; i++)
            {
                free[i] += free[i-1];
            }
            for(i = arr.length-1; i >= 0; i--)
            {
                int digit2 = (arr[i][i] / place) % 10;
                sort[free[digit2] - 1] = arr[i][i];
                free[digit2]--;
            }
            place *= 10;
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。