0

基本的に、プログラムは (X,Y,Z) 座標の範囲をユーザーに要求し、生成したい点の数を要求されます。値はオブジェクト クラスに渡され、そこでクイックソート アルゴリズムが実行されます。値が writeData クラスに渡されると、出力例がファイルに出力されます。ここで、ポイントの数は 2 (xyz 座標の 2 セット) で、範囲は 1 (正の無限大から負の無限大まで) です。

(0.01916820621893911),(0.7031915303569696),(0.8313160912583086)
(-0.9343528090486088),(0.015998642441189093),(0.49980249751031924)

出力からわかるように、まったくソートされていません。私のアルゴリズムが機能しているように見えるのに、なぜこの問題が発生しているのでしょうか。過去1時間ほどデバッグを試みましたが、役に立ちませんでした。また、多次元配列のクイックソートは実際にはあまり使用されないため、これが私が使用できる唯一のアルゴリズムでした。とにかく、このジレンマを解決するのに役立ついくつかの、または任意の入力が大いに役立ちます!

メインプログラム (短くて甘い) :

import java.io.*;
public class test {
  public static void main (String [] args) throws IOException {
  BufferedReader myInput = new BufferedReader (new InputStreamReader (System.in));

  testplus1 c = new testplus1();
  double dataPoints [][] = new double [3][10000];
  int numPoints;
  int range;
  String input;

  System.out.println("Please enter a range");
  input = myInput.readLine();
  range = Integer.parseInt(input);
  System.out.println("Please enter the number of points");
  input = myInput.readLine();
  numPoints = Integer.parseInt(input);
  c.setNumPoints(numPoints);
  c.setArray(dataPoints);
  c.setRange(range);

  c.fillArray(dataPoints,range,numPoints);
  } 
}

オブジェクトクラス

import java.io.*;

public class testplus1 {
  private static double [][] myDataPoints;
  private static double [][] sd;
  private static int myRange;
  private static int myNumPoints;

  public testplus1() throws IOException{
    myNumPoints = getNumPoints();
    myRange = getRange();
    myDataPoints = getArray();
    fillArray(myDataPoints,myRange,myNumPoints);
  }

  public void fillArray(double [][] myDataPoints,int myRange, int myNumPoints) throws IOException{
     for(int i = 0; i < myNumPoints; i++) {
      myDataPoints[0][i] =  2* (double)(Math.random () * myRange) - myRange; 
      myDataPoints[1][i] =  2* (double)(Math.random () * myRange) - myRange; 
      myDataPoints[2][i] =  2* (double)(Math.random () * myRange) - myRange; 
     sort(myDataPoints,0,0,myDataPoints.length-1);
     }
  }

 public double[][] sort(double[][] array, int key, int down, int top) throws IOException{
      double[][] a = new double[array.length][3];
      System.arraycopy(array,0,a,0, a.length);

       int i = down;
       int j = top;

       double x = a[(down + top) / 2][key];

        do {
            while (a[i][key] < x) {
                i++;
            }

            while (a[j][key] > x) {
                j--;
            }

            if (i <= j) {
                double[] temp = new double[a[i].length];

                for (int y = 0; y < a[i].length; y++) {
                    temp[y] = a[i][y];
                    a[i][y] = a[j][y];
                    a[j][y] = temp[y];
                }

                i++;
                j--;
            }
        } while (i <= j);

        if (down < j) {
            a = sort(a, key, down, j);
        }

        if (i < top) {
            a = sort(a, key, i, top);
        }
        writeData(myDataPoints);
        return a;

 }
  public static void writeData(double [][] myDataPoints) throws IOException {
    PrintWriter printWriter = (new PrintWriter ("test123"));
    for(int i = 0; i < myNumPoints; i++) {
      printWriter.println("(" + myDataPoints[0][i] + "),(" + myDataPoints[1][i] + "),(" + myDataPoints[2][i] + ")"); 
    }
    printWriter.close();
  }  

  public void setArray(double [][] dataPoints) {
    myDataPoints = dataPoints;
  }

  public double [][] getArray() {
    return myDataPoints;
  }

  public  void setNumPoints(int numPoints) {
    myNumPoints = numPoints;
  }

  public  int getNumPoints() {
    return myNumPoints; 
  }

  public void setRange(int range) {
    myRange = range; 
  }

  public int getRange() {
    return myRange; 
  }
}
4

2 に答える 2

0

あなたのsort方法を見てください。

public double[][] sort(double[][] array, int key, int down, int top) throws IOException{
    double[][] a = new double[array.length][3];
    System.arraycopy(array,0,a,0, a.length);

新しい配列aを作成し、元の入力配列の代わりにすべての操作を実行します (元の配列への変更は、メソッドの外部で自動的に表示されます)。最後に、 を返しますa。これは機能しますが、fillArray...

sort(myDataPoints,0,0,myDataPoints.length-1);

それを変数に割り当てません。唯一変更されるのは のコピーでありmyDataPoints、それ自体ではありませんmydataPoints

于 2013-11-03T19:57:37.393 に答える
0

を使用する必要がありますArrays.sortmyDataPoints最初のパラメータとして使用し、カスタム コンパレータを 2 番目のパラメータとして使用します。詳細については、http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(T[], java.util.Comparator)のドキュメントを確認してください。

値をどのように並べ替えるかについて詳しく教えていただければ、コンパレータの例を示すことができます。

于 2013-11-03T19:58:35.923 に答える