[ad_1]
再帰を使用してクイックソートをコーディングしようとしましたが、うまくいきませんでした。
私が試したこと:
package sorting; public class quicksort { public static int partition(int[] arr , int s,int e ) { int pivotelement = arr[s]; while(s<e) { //while without body to decrement e while(s<e && arr[--e]>pivotelement); if(s<e) { arr[s] = arr[e]; } //while without body to increment s while(s<e && arr[s++]<pivotelement); if(s<e) { arr[e] = arr[s]; } } arr[e] = pivotelement; return e ; } public static void quickSort(int[] arr,int s, int e) { if(e-s<2) { return; } int pivotindex = partition(arr,s,e); quickSort(arr , s,pivotindex); quickSort(arr,pivotindex+1,e); } public static void main(String[] args) { int[] arr = {1,3,5,2,8}; int s=0; int e = arr.length; quickSort(arr , s , e); for(int i=0;i<e-1;i++) { System.out.print(arr[i] +" "); } } }
解決策 1
コンパイルしても、コードが正しいとは限りません! :笑う:
開発プロセスは電子メールを書くことと考えてください。コンパイルが成功したということは、電子メールを適切な言語 (たとえば、ドイツ語ではなく英語) で作成したことを意味します。電子メールに送信したいメッセージが含まれていたわけではありません。
これで、開発の第 2 段階に入ります (実際には第 4 段階または第 5 段階ですが、後で前の段階に進みます): テストとデバッグです。
それが何をするのか、そしてそれがあなたが望んでいたものとどのように違うのかを見ることから始めてください。 これは、なぜそれを行っているのかについての情報を提供するため、重要です。 たとえば、プログラムがユーザーに数字を入力させることを目的としており、それを2倍にして答えを出力する場合、入力/出力が次のようになると:
Input Expected output Actual output 1 2 1 2 4 4 3 6 9 4 8 16
次に、問題がそれを2倍にするビットにあることは明らかです-それ自体を加算したり、2倍したりするのではなく、それ自体を乗算して入力の2乗を返します。
それで、コードを見ることができ、それがここのどこかにあることは明らかです:
int Double(int value) { return value * value; }
何がうまくいかないのかがわかったら、デバッガーを使用して原因を突き止めます。 メソッドの最初の行にブレークポイントを置き、アプリを実行します。 ブレークポイントに到達すると、デバッガーが停止し、制御がユーザーに渡されます。 コードを行ごとに実行し (「シングル ステップ」と呼ばれます)、必要に応じて変数の内容を確認 (または変更) できるようになりました (コードを変更して、必要に応じて再試行することもできます)。
コードを実行する前に、コードの各行が何をすべきかを考え、「ステップ オーバー」ボタンを使用して各行を順番に実行したときに実際に何をしたかを比較します。 それはあなたが期待したことをしましたか? その場合は、次の行に進みます。
そうでない場合、なぜですか? どう違うの?
うまくいけば、そのコードのどの部分に問題があり、何が問題なのかを突き止めるのに役立つはずです。
これはスキルであり、開発だけでなく現実の世界でも役立つため、開発する価値のあるスキルです。 そして、すべてのスキルと同様に、それは使用することによってのみ向上します!
解決策 2
あなたは書く必要があります:
int tmp = arr[s]; arr[s] = arr[e]; arr[e] = tmp; ... int tmp = arr[e]; arr[e] = arr[s]; arr[s] = tmp;
[ad_2]
コメント