基本的に、プログラムは (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;
}
}