2

私はプログラミングとJavaに非常に慣れていないので、これを笑わないでください:)。今..私はQuickSortアルゴリズムの正しい実装をネットで調べましたが、私はそれを認識しています. しかし、私は自分で考えられる非常に無邪気で基本的な方法でそれを実装しようとしました。実際に2つの別々の配列(左、右)を作成し、それらを並べ替え続けます...

これはコードです:

package excercise;

public class MyQuickSort {


    public static int list[] = {6,5,3,1,8,7,2,4};


    public static int[] addNumberToArray(int array[],int num){
        int newArray[] = new int[array.length+1];
        for(int i = 0;i<array.length;i++){
            newArray[i] = array[i];
        }
        newArray[newArray.length-1] = num;
        array = newArray;
        return array;
    }


    public static int[] partition(int arr[]){

        while(arr.length>1){
            int pivotIndex = (int)(arr.length/2);
            int left[] = new int[0];
            int right[] = new int[0];

            for(int i = 0;i<arr.length;i++){
                if(i==pivotIndex){
                    continue;
                }

                else if(arr[i]<=arr[pivotIndex]){
                    left = addNumberToArray(left,arr[i]);
                }
                else{
                    right = addNumberToArray(right,arr[i]);
                }
            }
            int origPivot = arr[pivotIndex];
            int k = 0;
            while(k<left.length){
                arr[k] = left[k];
                k++;
            }
            arr[k] = origPivot;
            k++;
            while(k<arr.length){
                arr[k] = right[k-(left.length+1)];
            }


            if(left.length>1){
            partition(left);
            }

            if(right.length>1){
            partition(right);
            }

        }

            return arr;
    }




    public static void main(String[]args){
            list = partition(list);
            for(int i = 0;i<list.length;i++){
                System.out.print(list[i]+" ");
            }

        }
    }

しかし、なぜこれがループに陥って機能しないのでしょうか? このコードの何が問題なのかわかりません..ただし、これはあまり効率的ではありません (控えめに言っても)! しかし、私は頑固で、とにかくそれを機能させたいと思っています..何かアドバイスがあれば、それは素晴らしいことです! thx事前に

わかりました、これは新しいコードです。デバッグ後はすべて正常に動作しているように見えますが、新しい並べ替えられた arr を出力したい場合でも、元の並べ替えられていない配列が出力されます。再帰はすべてを最初の場所に戻します。「手順を保存」するにはどうすればよいですか?「return」コールはどこに置き、何を返す必要がありますか?

public class MyQuickSort {

    public static int list[] = {6,5,3,1,8,7,2,4};
    public static boolean sorted;
    public static int[] addNumberToArray(int arr[],int num){
        int newArr[] = new int[arr.length+1];
        for(int i = 0;i<arr.length;i++){
            newArr[i] = arr[i];
        }
        newArr[newArr.length-1] = num;
        arr = newArr;
        return arr;

    }


    public static void partition(int arr[]){

        while(!sorted){
            int pivotIndex = (int)(arr.length/2);
            int left[] = new int[0];
            int right[] = new int[0];

            for(int i = 0;i<arr.length;i++){
                if(i==pivotIndex){
                    continue;
                }
                else if(arr[i]<=arr[pivotIndex]){
                    left = addNumberToArray(left,arr[i]);
                }
                else{
                    right = addNumberToArray(right,arr[i]);
                }
            }
            int origPivot = arr[pivotIndex];
            int k = 0;
            while(k<left.length){
                arr[k] = left[k];
                k++;
            }
            arr[k] = origPivot;
            k++;
            while(k<arr.length){
                arr[k] = right[arr.length-arr.length-(left.length+1)+k];
                k++;
            }


            if(left.length>1){
                partition(left);
            }


            if(right.length>1){
                partition(right);
            }

            if(left.length<=1&&right.length<=1){
                sorted = true;

            }

        }



    }








    public static void main(String[] args) {
        partition(list);
        for(int i = 0;i<list.length;i++){
            System.out.print(list[i]+" ");
        }


    }

}
4

2 に答える 2

1

アルゴリズムがこのループに陥る

while(k<arr.length){
    arr[k] = right[k-(left.length+1)];
}

その理由は、k をインクリメントしないためです。

試す

while(k<arr.length){
    arr[k] = right[k-(left.length+1)];
    k++;
}
于 2013-02-11T10:19:47.210 に答える
1

涼しい!あなたの実装は論理的にクイックソートを描いているようです。ただし、追加のバッファーを使用してクイックソートを実装しないことに注意してください。呼び出しを再帰的に開始境界と終了境界だけを渡して、独自のメイン配列でソートする必要があります。あなたの実装は、クイックソートロジックを使用して、よりマージソートスタイルです。はい、上記のコメンターが述べたように、k ++を見逃しました。

于 2013-02-11T10:37:10.323 に答える