- 締切済み
Javaのプログラムが完成出来ません・・・
この前、大学からこんな課題が出されました。 以下の条件が含まれてるシェルソートのプログラムを作成せよ。 条件。 ・ソート済み部分に新しい値を挿入するための空き場所を作るメソッドを入れること。 ・配列の逆順数を計算するメソッドを入れる。 ・今の歩幅より一段階小さい歩幅を計算するメソッドを入れる。 ・配列の大きさに一番合った歩幅を計算するメソッドを入れる。 ・歩幅hの挿入ソートを行うメソッドを入れる。 ・シェルソートを行うメソッドを入れる。 ・mainメソッドを完成させ、ソート過程を表示しながらシェルソートを実行するようにする。 ・作成したプログラムが正しく選択ソートを実行していることが分かる実行結果を示すこと。 ・値は、 a[0]=0, a[1]=30, a[2]=20,a[3]=10 一応プログラムは、 class ShellSort{ static int compare = 0; static int copy = 0; static void showArray(int a[], int N){ //2-0:逆順数と共に配列の内容を表示するメソッド //動作:N個の要素を持つ配列aの要素を全て画面に表示する //} static void initArray(int a[], int N){ //2-0:配列にランダムな値を代入するメソッド //動作:N個の要素を持つ配列aに対し、1~Nまでの範囲の数をランダムに入れる //ただし、a[0]には常に0を入れること。 } static int shiftLargerElements(int a[], int v, int i){ //2-0:ソート済み部分に新しい値を挿入するための空き場所を // 作るメソッド //動作:配列aに対し、a[i]より手前にあるvより大きい要素を後ろ //に1つずつずらしてvを挿入するための空き場所を作る。最後に、 //できた空き場所の添え字を戻り値として返す。 //空き場所を作るまでに行った比較回数を変数compareに加算 //空き場所を作るまでに行ったコピー回数を変数copyに加算 int space = 0; int j; j = i; while((compare++ >= 0) && (a[j-1] > v)){ a[j] = a[j-1]; copy++; j--; } space = j; return space; } static int shiftLargerElements(int a[], int v, int i, int h) { //2-1:ソート済み部分に新しい値を挿入するための空き場所を // 作るメソッド //動作:配列aに対し、a[i]より手前にある要素 //a[i-h],a[i-2h],a[i-3h],...のうち、vより大きい各要素を後ろに //hだけ移動させてvを挿入するための空き場所を作る。 //最後に、できた空き場所の添え字を戻り値として返す。 //空き場所を作るまでに行った比較回数を変数compareに加算 //空き場所を作るまでに行ったコピー回数を変数copyに加算 int space = 0; return space; } 現在はここまでしか作成出来てません。 それ以降でつまづいています。 分かる人がいましたら、是非教えて下さい。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- chomakichi
- ベストアンサー率57% (22/38)
なるほど~ 処理の流れ順(mainメソッド参照)にロジックを組んでいくとわかり易いかもしれませんよ? (配列用意して、配列の内容を表示して、ソートして、結果を表示・・・) ところで、シェルソートのアルゴリズムやjavaプログラミングについては講義で習ったんです? これを理解してないと完成できないでしょう。 こちらで課題を作成できれば良いのですが、、、。 あまり時間を避けないので、申し訳ないです。
- chomakichi
- ベストアンサー率57% (22/38)
わからない文章はどれでしょうか? 単語の意味がわからないだけでは?
補足
最初以外全部ですね・・・。 最初は、 public static void initArray(int[] a){ //配列aの全要素にたいして行う for(int i=0;i<MAX;i++){ //a[i]にint型の数を代入 a[i] = nextInt(30); } } こんな感じに書きました。
- chomakichi
- ベストアンサー率57% (22/38)
誰も回答していないので、、、。 質問にしてはちょっとボリュームが大き過ぎではありませんか? どこで躓いているのか?何がわからなくて躓いているのか? などがわかるとそのポイントくらいは回答して頂けると思いますよ。
補足
static int reverseNumber(int a[], int N) { //2-2:配列の逆順数を計算するメソッド //動作:要素をN個持つ配列aに対して逆順数(テキストp.119参照) // を計算する /* 例: a[0]=0, a[1]=30, a[2]=20,a[3]=10の場合 reverseNumber(a,3)を実行すると3を返す a[1]より大きくかつ左側にある要素は0個 a[2]より大きくかつ左側にある要素は1個 a[3]より大きくかつ左側にある要素は2個 以上を合計すると3になる。 */ //★以降を適切に埋めよ(課題2-2) int val = 0; return val; } static int smallerInterval(int h) { //2-3:今の歩幅より一段小さい歩幅を計算するメソッド //動作:歩幅hの次に小さい歩幅を // インターバル数列 h = 3h +1 // に従って計算する // 次に小さい歩幅が1より小さいときは歩幅として0を返す //★以降を適切に埋めよ(課題2-3) int interval = 0; return interval; } static int largerInterval(int h) { //2-0:今の歩幅より一段大きい歩幅を計算するメソッド //動作:歩幅hの次に大きい歩幅を // インターバル数列 h = 3h +1 // に従って計算する int interval = 0; return interval; } static int largestInterval(int N) { //2-4:配列の大きさに一番合った歩幅を計算するメソッド //動作:要素数Nの配列をシェルソートする時に使う最も大きい歩幅を // インターバル数列 h = 3h +1 // に従って計算する //★以降を適切に埋めよ(課題2-4) int interval = 1; return interval; } static void insertion(int a[], int N) { //2-0:挿入ソートを行うメソッド int i; int v,space; for(i=1;i<N;i++){ v = a[i]; copy++; space = shiftLargerElements(a,v,i); a[space] = v; copy++; } } static void insertion(int a[], int N, int h) { //2-5:歩幅hの挿入ソートを行うメソッド /* shiftLargerElementsメソッドを用い、 a[0],a[h],a[2h],a[3h],... a[1],a[1+h],a[1+2h],a[1+3h],... a[2],a[2+h],a[2+2h],a[2+3h],... . . . a[h-1],a[(h-1)+h],a[(h-1)+h],a[(h-1)+h],... の各グループをそれぞれ挿入ソートする。 */ /* a[j],a[j+h],a[j+2h],a[j+3h],...のグループを挿入ソー トするための手順は次の通りである。 iの値を(i+jの値がNを超えない範囲で)hずつ増やしながら 次のことを行う。 1.変数vにa[i+j]の値を覚えておく 2.shiftLargerElements(配列,値,添え字,歩幅)メソッドを 用い、a[i+j]を挿入するための空き場所を作る 3.上記2.で作った空き場所にvの内容をコピー あとは0,1,2,...,h-1の各jの値に対して上の要領で 各グループを挿入ソートすればよい */ //★以降を適切に埋めよ(課題2-5) int i,j,v,space; for(j=0;j<h;j++){ //a[j],a[j+h],a[j+2h],a[j+3h],...のグループを挿入ソート //1グループ分のソートが終わる毎に配列の内容を表示 } } static void shellSort(int a[], int N) { //2-6:シェルソートを行うメソッド int h; /* 処理手順は次のようになる 1.largestIntervalメソッドを使って最初の歩幅を計算 2.歩幅が0より大きい間次の処理を繰り返す 2-1.歩幅の値を画面に表示 2-2.insertion(配列,要素数,歩幅)メソッドを使って 歩幅hの挿入ソートを実行 2-3.smallerIntervalメソッドを使い、歩幅hを一段階小さ い歩幅に更新 */ //★以降を適切に埋めよ(課題2-6) } public static void main(String args[]) { //2-7:上で作ったメソッドを用いて、ソート過程を表示しながら //シェルソートを実行 //手順は次のようになる。 /* 1.要素を(27個もつ)整数型配列aを宣言 2.整数型変数Nに配列aの要素数を保存 3.initArrayメソッドを用いて配列aを初期化 4.showArrayメソッドを用いてソート前の配列aの内容を表示 5.変数compare,copyの値を0に初期化 6.shellSortメソッドを用いて配列aをシェルソート 7.showArrayメソッドを用いてソート後の配列aの内容を表示 8.ソートにかかった比較・コピーの回数を表示 */ //★以降を適切に埋めよ(課題2-7) } } これが質問に載ってたプログラムの続きです。 //にある文章の意味が分からなくて作成出来ません。 分かる部分だけでも教えてくだされば・・・。
補足
そうですか・・・。 来週の日曜日に提出でありますのに、時間があまりとれないのは仕方ないですねorz 課題3,4以外は自力で出来ましたが、3,4が全然解けないのです・・・。 因みにJavaは独学で勉強しています。