简体   繁体   English

我不知道是什么让我的基数排序方法搞砸了

[英]I cant figure out what is making my radix sorting method mess up

import java.util.LinkedList;
import java.util.Queue;

public class RadixSort {

    public static void main(String[] args) {
        int[] data = { 5, 126, 75, 10, 15, 634, 9 };

        data = radixSort(data);

        for (int nums : data) {
            System.out.println(nums);
        }
    }

    public static int[] radixSort(int[] in) {
        Queue<Integer> zero = new LinkedList<>();
        Queue<Integer> one = new LinkedList<>();
        Queue<Integer> two = new LinkedList<>();
        Queue<Integer> three = new LinkedList<>();
        Queue<Integer> four = new LinkedList<>();
        Queue<Integer> five = new LinkedList<>();
        Queue<Integer> six = new LinkedList<>();
        Queue<Integer> seven = new LinkedList<>();
        Queue<Integer> eight = new LinkedList<>();
        Queue<Integer> nine = new LinkedList<>();

        for (int pass = 3; pass > 0; pass--) {
            for (int nums : in) {
                System.out.println(nums);
            }
            System.out.println("pass " + (3 - pass));
            for (int i = 0; i < in.length; i++) {
                int num = (int) ((in[i] / Math.pow(10, pass)) % 10);
                switch (num) {
                case 0:
                    zero.add(in[i]);
                    break;
                case 1:
                    one.add(in[i]);
                    break;
                case 2:
                    two.add(in[i]);
                    break;
                case 3:
                    three.add(in[i]);
                    break;
                case 4:
                    four.add(in[i]);
                    break;
                case 5:
                    five.add(in[i]);
                    break;
                case 6:
                    six.add(in[i]);
                    break;
                case 7:
                    seven.add(in[i]);
                    break;
                case 8:
                    eight.add(in[i]);
                    break;
                case 9:
                    nine.add(in[i]);
                    break;
                default:
                }
            }
            int[] newArr = new int[in.length];
            int arrSize = 0;
            if (zero.size() > 0) {
                int size = zero.size();
                for (int k = 0; k < size; k++) {
                    newArr[arrSize] = zero.poll();
                    arrSize++;
                }
            }
            
            if (one.size() > 0) {
                int size = one.size();
                for (int k = 0; k < size; k++) {
                    newArr[arrSize] = one.poll();
                    arrSize++;
                }
            }
            
            if (two.size() > 0) {
                int size = two.size();
                for (int k = 0; k < size; k++) {
                    newArr[arrSize] = two.poll();
                    arrSize++;
                }
            }
            
            if (three.size() > 0) {
                int size = three.size();
                for (int k = 0; k < size; k++) {
                    newArr[arrSize] = three.poll();
                    arrSize++;
                }
            }

            if (four.size() > 0) {
                int size = four.size();
                for (int k = 0; k < size; k++) {
                    newArr[arrSize] = four.poll();
                    arrSize++;
                }
            }

            if (five.size() > 0) {
                int size = five.size();
                for (int k = 0; k < size; k++) {
                    newArr[arrSize] = five.poll();
                    arrSize++;
                }
            }

            if (six.size() > 0) {
                int size = six.size();
                for (int k = 0; k < size; k++) {
                    newArr[arrSize] = six.poll();
                    arrSize++;
                }
            }

            if (seven.size() > 0) {
                int size = seven.size();
                for (int k = 0; k < size; k++) {
                    newArr[arrSize] = seven.poll();
                    arrSize++;
                }
            }

            if (eight.size() > 0) {
                int size = eight.size();
                for (int k = 0; k < size; k++) {
                    newArr[arrSize] = eight.poll();
                    arrSize++;
                }
            }

            if (nine.size() > 0) {
                int size = nine.size();
                for (int k = 0; k < size; k++) {
                    newArr[arrSize] = nine.poll();
                    arrSize++;
                }
            }
            in = newArr;
        }
        return in;
    }
}

this prints out:这打印出来:

5 126 75 10 15 634 9 pass 0 5 126 75 10 15 634 9 pass 1 5 75 10 15 9 126 634 pass 2 5 9 10 15 126 634 75 5 126 75 10 15 634 9 通过 0 5 126 75 10 15 634 9 通过 1 5 75 10 15 9 126 634 通过 2 5 9 10 15 126 634 75

I know that it has to do something with the fact that on the pass where I am checking for the 10s slot that 7 is the largest value.我知道这与以下事实有关,即在我检查 10s 插槽的过程中,7 是最大值。 It forgets that 126 and 634 are still bigger, they just have lesser value in the 10s slot.它忘记了 126 和 634 仍然更大,它们只是在 10s 插槽中的价值较小。 But I do not know how to make it so that it maintains the order of 100s.但是我不知道如何使它保持100s的顺序。

Only one small issue in your code with the loop counting the passes:您的代码中只有一个小问题,循环计数通过:

for (int pass = 3; pass > 0; pass--)

As you can see the variable pass can never reach zero, which means that your sorting never considers the last digit of your numbers.如您所见,变量pass永远不会达到零,这意味着您的排序永远不会考虑数字的最后一位。 Also, you consider the most-significant digits first but reorder all numbers in the later passes.此外,您首先考虑最重要的数字,但在后面的通道中重新排序所有数字。 This means you should also revert the order of digit evaluation.这意味着您还应该恢复数字评估的顺序。 To do this simply change the for loop to this:为此,只需将 for 循环更改为:

for (int pass = 0; pass < 3; pass++)

This results in the following output (last section is sorted):这导致以下 output (最后一节已排序):

5
126
75
10
15
634
9
pass 3
10
634
5
75
15
126
9
pass 2
5
9
10
15
126
634
75
pass 1
5
9
10
15
75
126
634

PS: One pass can also be removed as your numbers are all below 1000. PS:因为你的数字都在1000以下,所以也可以删除一通。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM