注:Radixソートを再帰的に実装する - 最後に要素を印刷する方法は?
私はすでにこのプログラムの開発before上の具体的な質問をし、今私は非常に最後のステップでこだわっていると私はそれのための新しいスレッドを開くために、より良いかもしれませんね。
説明:
Iは、(これは基本的には基数ソートである)を再帰的に0から99999までの数字をソートするプログラムの開発を実現するために必要です。プロセス自体はまったく同じです:ユーザーはメインメソッドのそれらの数値を含む配列をタイプします。次に、mainメソッドはsortメソッドを呼び出します。ここでは、10行1列の 'space'という2次元配列を作成します。次に、配列内のすべての数値を最初の実行で10.000になる桁で除算します。たとえば、23456/10000 = 2,3456 = 2(java)の場合、プログラムはこの数をスペース[2] [0]に入れます。次に、この行全体を取り出し、それを拡張します。これはputInBucketメソッドで行われます。これは、同じ行に別の番号を入れることができるようにするためです。
「numbers」配列の内側にあるすべての番号に対してこれを行います。次に、これらの行を処理して同じ原則で再度ソートするとしますが、ここで2桁目を見ていきます。私たちは、右から左へではなく、左から右にこれをしたいと思っています。我々はそうするためには3と4を比較したいと思います、私たちの第二列は、この
[23456、24567]のようになります場合
ので、私たちは、各再帰で桁/ 10を計算しますコール。数字が0の場合は、もう並べ替えるものはありません。
再帰呼び出し自体は、0から9の行で動作します。ここでは、以前に異なる数値を入れて、別の行に入れて並べ替えます。
質問:
私はプログラムの開発は、行うことになっているものんだと思います。残念ながら、結果を適切に印刷する方法はわかりません。たとえば、以下のコードでは、メインメソッドでバケットを印刷しようとしましたが、ちょうど私が入力した配列だけが正確に表示されるので、正しいとは限りません。
行9のすべての要素で開始する必要があります。この行に複数の数値が含まれている場合は、再帰呼び出しの結果で並べ替える必要があります。
これを正しく実装する方法を知っている人はいますか?前もって感謝します!
public static int[] sort(int[] numbers, int digit) {
if (numbers.length <= 1 || digits == 0)
return numbers;
int[][]space = new int[10][1];
int i, j = 0;
for (j = 0; j < numbers.length; j++) {
i = numbers[j]/digit % 10;
space[i][0] = numbers[j];
space[i] = putInBucket(space[i], numbers[j]);
}
digit = digit/10;
for (i = 0; i < 9; i++) {
sort(space[i], digit);
}
return numbers
}
private static int[] putInBucket(int[] bucket, int number) {
int[] bucket_new = new int[bucket.length+1];
for (int i = 1; i < bucket_new.length; i++) {
bucket_new[i] = bucket[i-1];
}
return bucket_new;
}
public static void main (String [] argv) {
int[] numbers = IO.readInts("Numbers: ");
int digit = 10000;
int[] bucket = sort(numbers, digit);
for (int i = 0; i < bucket.length; i++) {
System.out.println(bucket[i]);
}
ありがとう、あなたの努力のために! :-) – Julian
それは私にとっても実りありました。私は多次元配列の行が固定されている(間違った)仮定の下にいました。 –