• ベストアンサー

平成14年 春期 基本情報技術者 午後 問04   擬似言語の記述形式

設問2で2回目がなぜ このような値になるのかが 理解できません

質問者が選んだベストアンサー

  • ベストアンサー
noname#50176
noname#50176
回答No.1

まず、このソートの仕組みを簡単にしてみましょう。 (番目とは何番目の要素かを意味するものです) 1.数値配列の比較元の最小番目と比較先の最小番目+1~最大番目を比較し、 同じ:比較先の番目を1足して次に進める 比較元>比較先:比較元をピボットとする 比較元<比較先:比較先をピボットとする 2.1回目のソートはこのピボット値を基準に 最小=0/最大=最大要素数-1 (要素数9個ならNo0からNo8で8が最大値なので-1をします) 3.1回目の結果から得られたピボットを基準に、 4.ピボットより左側をさらに整列、この結果のピボットの結果を 基準に少なくなった要素列の左をさらに整列 5.4を繰り返し整列できなくなったら直前の4に戻り今度は右を 整列、さらに4を繰り返す 6.4、5を繰り返しクイックソートは完了です。 では、トレースチャートで示します (min=最小番目/max=最大番目/p=ピボット値) 3584069127…開始(min=0/max=9/p=5)3と5の比較で大きい5がピボット 7584069123…3,7 入れ替え.7<3,3>=5 比較不成立で(min=0/max=9) 3584069127…7,3入れ替え.3<5でmin+1,7>=5でmax-1(min=1/max=8) 3284069157…5,2 入れ替え.2<5でmin+1,5>=5でmax-1(min=2/max=7) 3214069857…8,1 入れ替え.1<5でmin+1,8>=5でmax-1(min=3/max=6) 3219064857…4,9 入れ替え.9<5,4>=5 比較不成立で(min=3/max=6) 3214069857…9,4 入れ替え.4<5でmin+1,9>=5でmax-1(min=4/max=5) 3214609857…0,6 入れ替え.min,max変わらず(min=4/max=5) 3214069857…6,0 入れ替え.0<5,6>=5によりmin+1,max-1.(min=5/max=4)…min>max で一旦終了. よって、3214069857 となります。

C_is_Best
質問者

お礼

非常に難しいです

C_is_Best
質問者

補足

3584069127…開始(min=0/max=9/p=5)3と5の比較で大きい5がピボット 7584069123…3,7 入れ替え.7<3,3>=5 比較不成立で(min=0/max=9) ------------------------------------------------------------ すでにここで 理解できなくなってます なぜ5より小さい3を右へ 5より大きい7を左へと 交換するのかが わかっていません 5と2の交換は理解できるのですが

その他の回答 (3)

noname#50176
noname#50176
回答No.4

>なぜ5より小さい3を右へ 5より大きい7を左へと… これは、Arrange 関数のリストですが (あえて矢印を使っていますが、矢印が文字化けしていたらすみません) 3584069127…開始(Min=0/Max=9/Pivot=5) 元の QuickSort 関数が、“Arrange(A[], Min, Max, Pivot, K)”を呼び出します。 つまり最初は“Arrange(A[], 0, 9, 5, K)”と同じ意味ですね。 K は“Kの値を渡す”のではなく“戻り値を格納する変数のアドレス番地を渡す”と解釈して下さい。 では実際に以下の Arrange を処理していきます。 ○副プログラム名:Arrange(A[], Min, Max, Pivot, Ret) … 1 ○整数型:L,R,Tmp … 2 ・L ← Min … 3 ・R ← Max … 4 ■L≦R … 5 |・Tmp ← A[L] … 6 |・A[L] ← A[R] … 7 |・A[R] ← Tmp … 8 |■A[L] < Pivot … 9 ||・L ← L + 1 … 10 |■ |■A[R] ≧ Pivot … 11 ||・R ← R - 1 … 12 |■ ■ ・Ret ← L … 13 まず、1の時点で、A[]=ソート配列、Min=0、Max=9、Pivot=5、Ret は不定です。 この時点で、A[]=3584069127 次に、2の時点で、変数を定義、3、4の時点で、L=0、R=9 です 5の時点で、0≦9 で成立していますから、6へ進みます。 6~8の時点で、A[0]とA[9]を入れ替えます。 ※9~12の時点で行う判定より前に強制的に入れ替えるのです。 ですから、 A[]=7584069123 となり、A[0]=7、A[9]=3、に変更されます。 次に9のこの時点では、A[0]<5、つまり 7<5 で不成立となり11へ飛びます。 ( L は10を飛ばすので変わりません) 次に11のこの時点では、A[9]≧5、つまり 3≧5 で不成立となりループで5へ飛びます。 ( R は12を飛ばすので変わりません) この時点で、A[]=7584069123 5の時点で、0≦9 で成立していますから、6へ進みます。 6~8の時点で、A[0]とA[9]を入れ替えます。 この時点で、A[]=3584069127 元に戻りますね。 次に9のこの時点では、A[0]<5、つまり 3<5 で成立となり10へ進みます。 10の時点で、L=L+1 つまり、L=0+1=1、ループで9へ戻ります。 9のこの時点では、A[1]<5、つまり 5<5 で不成立となり11へ飛びます。 次に11のこの時点では、A[9]≧5、つまり 7≧5 で成立となり12へ進みます。 12の時点で、R=R-1 つまり、R=9-1=8、ループで11へ戻ります。 11のこの時点では、A[8]≧5、つまり 2≧5 で不成立となりループで5へ飛びます。 5の時点で、1≦8 で成立していますから、6へ進みます。 6~8の時点で、A[1]とA[8]を入れ替えます。 A[]=3284069157 ですね。 同様に繰り返していけば A[]=321406985 になるはずです。

C_is_Best
質問者

お礼

やっとできました フローチャートをしっかりみず 説明文のみで解こうとしていたのが まちがいでした 値とフローがつながりました

noname#50176
noname#50176
回答No.3

すみません。Arannge関数 の部分は以下に訂正して下さい。 1.min番目がmax番目より… 大きければこの関数は終了 同じか大きければ2.へ (最初は、min番目:0番目、max番目:9番目で2.へ行きますね) 2.min番目の数値とmax番目の数値を入れ替える 3.min番目の数値とピボット値を比較してmin番目の数値が… ピボット値より小さかったらminを次に進め (min=min+1) 3.へ戻って繰り返す。 ピボット値より大きいか同じであれば4.へ ※これはピボットより左は必ずピボットより小さくなるように 小さくなかった所までminを進めます。 4.max番目の数値とピボット値を比較してmax番目の数値が… ピボット値より大きいか、同じであればmaxを1つ前に戻し (max=max-1) 4.へ戻って繰り返す ピボット値より小さかったら 1.へ(ループですね) ※これはピボットより右は必ずピボットより大きくなるように 小さかった所までmaxを戻す(9,8,7…のように逆方向に進める)。 【注意】:3.4.の“同じであれば”とありますが以前のFindPivot関数で “値が異なれば繰り返し…”によりここで同じになることは あり得ません。

noname#50176
noname#50176
回答No.2

私も初めてこの問題やったときは20分もかかってしまったので(汗) 実際の変化だけ知ってもらえれば大丈夫です。 3584069127…開始(min=0/max=9/p=5)3と5の比較で大きい5がピボット FindPivot関数は、 1.min番目とmin+1番目を比較し 値が異なれば内容数値の大きい方の要素番号(何番目かを示す) 2.同じであれば比較対照のmaxを次の要素にして(max=max+1) 1.へ戻り繰り返し、1.で異なっていたらこのFindPivot関数は終了 となり、 最初、min=0,max=9 なので、 A[min]とA[min+1]、つまり A[0]とA[1]を比較。 A[0]=0番目の内容:3 / A[1]=1番目の内容:5 3<5 で5が大きいので大きいほうの min+1 を返します。 これは K=min+1 と記述されているので、Kを返すわけです。 結果ここでは 1 となります。 この関数から戻ると、(j = 結果の1)pivot=A[j] としているので pivot=A[1] つまり pivot=5(A[1]の内容が5)でpivotを示す pは5です。(p はこの回答説明用でpivotと同じです) 続いて、 入れ替え処理のメインとなる Arrange関数は次の流れになります。 1.min番目の数値とmax番目の数値を入れ替える 2.min番目の数値とピボット値を比較してmin番目の数値が… ピボット値より小さかったらminを次に進め (min=min+1) 2.へ戻って繰り返す。 ピボット値より大きいか同じであれば3.へ ※これはピボットより左は必ずピボットより小さくなるように 小さくなかった所までminを進めます。 3.max番目の数値とピボット値を比較してmax番目の数値が… ピボット値より大きいか、同じであればmaxを1つ前に戻し (max=max-1) 3.へ戻って繰り返す ピボット値より小さかったら 4.へ ※これはピボットより右は必ずピボットより大きくなるように 小さかった所までmaxを戻す(9,8,7…のように逆方向に進める)。 【注意】:3.4.の“同じであれば”とありますが以前のFindPivot関数で “値が異なれば繰り返し…”によりここで同じになることは あり得ません。 「言ってることが、解らない!!」 と感じてしまうようであれば、上記のArrange関数の流れと、 回答のNo.1で載せましたトレースチャートと見比べてみてください。 特に「ここが難しい」と感じられましたら気兼ねなく おっしゃって下さい。

関連するQ&A

  • 平成18年 春期 基本情報技術者 午後 問05   プログラム設計

    設問3で 中間ファイルと応募者ファイルの顧客番号が一致したか しないか以外の条件はなにか理解できません どなたか教えてください

  • 平成21年 春期 基本情報技術者 午後 問06

    平成21年 春期 基本情報技術者 午後 問06  設問3の「f」の回答の求め方を知っている方はいらっしゃいますでしょうか。 ここだけ回答が導き出せませんでしたので、知っていたら教えて頂きたいと思います。 秋に基本情報技術者試験を受験しようと思い勉強中です。

  • 平成21年 春期 基本情報技術者 午後 問01

    平成21年 春期 基本情報技術者 午後 問01 の設問3の回答が「エ」で黒白黒の並びというのですが、どうしてか解説をして下さる方はいらっしゃいますでしょうか。 秋に基本情報技術者試験を受験しようと思い勉強中です。 私は「1番上の行の左端の画素は白で始まるものとする」という文章から答えを「ウ」と選択してしまいました。

  • 基本情報技術平成21年春午後問8の質問

    基本情報技術平成21年春午後問8の設問eとfの動作の追跡が理解できません。 何か勘違いをしているのだろうと思うのですが、ポイントがどこなのか判りません。 どなたか解説して頂けないでしょうか? 宜しくお願い致します 行番号12~14を取り去って~~の設問です

  • 平成15年 春期 基本情報技術者 午後 問01

    http://情報処理試験.jp/FE15a-pm/t01.html 参考書にて上記の問題の解説を読んだ上での質問です。 (1)最初の命令(2100 011B)を実行する前に、すでに汎用レジスタ0には「0003」がセットされているとのことですが、なぜその値がセットされているのでしょうか。問題文の通りだと、命令実行前は「0113」がセットされているはずでは? (2)RとXとIを求める際に、例えば、命令が2170 0111の場合には、「70」を「0111 0000」の2進数に変換し、Rが01、Xが11、Iが0だということですが、Iがなぜ0なのかがわかりません。問題文から、Iは1バイトということですが、「0000」は4バイトなのに、なぜIは「0」?? というか、Iは1バイトなのに、なぜ「0000」??

  • 平成18年春期午後問題の問3がわかりません

    お世話になっております。 過去問題を勉強中、わからない問題があったので、 教えていただけないでしょうか。 <わからない問題> ●設問1のbについて  0.9*08の結果(イ)が答えになるのですが、  なぜ、0.9*0.8*0.9ではないのでしょうか。 ●設問2のcについて  週末時も「(2)」の稼働率は図1よりも稼働率は大きくなる  ようです。  その確認方法(計算方法)はどのように求めるのでしょうか。 以上、よろしくお願いします。     

  • 平成17年 春期 基本情報技術者 午後 教えてください

    平成17年 春期 基本情報技術者 午後 問02   文字列を置換するプログラム dの回答が イ B[Bidx] ← S[0] である 理由が 理解できません どなたか解説を お願いします

  • 基本情報 14年秋期午後問(2)について

    こんにちは、2010年10月の基本情報技術者試験を受験して 午後試験で 50.50点だったものです。 趣味でプログラミングをしていて、 JavaScriptでポーカーを再現し、 同じくJavaScriptで音声は出ませんが、 http://sdin.jp/browser/casino/blackjack/ と同様の動作をするブラックジャックを作るくらいです。 ( CGI, サーバーのことはよくわかりません。) 現在 暇な時間をみて、4月の同試験の受験に向けて勉強しているのですが、 わからないことが出てきましたので、質問させていただきます。 以下のサイトをコピペして、みていただきたいのですが・・・ http://情報処理試験.jp/FE14b-pm/t02.html (1)「問2の設問2は、リストの要素のポインタの値を変えるだけなので、   そのオーダは、テキストの文章の行数に関係なく[定数]である。」 (2)「設問1は、二重ループである挿入ソートの値をずらしていく部分と   同様な処理なので、一重のループであり、オーダは [n] である。   よって、行数やCPの値でオーダは変化する。」 (1)、(2)のような解釈でよいのでしょうか。 もし間違っていたら、どなたか、教えていただけないでしょうか。 よろしくお願いします。

  • 基本情報技術者 平成22年秋期 午後問5について

    基本情報技術者過去問題 平成22年秋期 午後問5 ソフトウェア設計の 設問4、5について、解説を読みましたが全く理解できません。 そもそも「図3 棚卸計算処理の流れ」でどのような処理をしているのかのイメージが できません。 どなたか、解説をお願いできませんでしょうか。 ※解説については、下記サイトを参照しました。 http://www.fe-siken.com/kakomon/22_aki/pm05.html

  • 基本情報 平成16年 春期 問5について

    こんにちは。 7月の基本情報技術者試験を受験しようと思って、 暇を見て対策に取り組んでいる者です。 過去問を解いていてわからないことが出てまいりましたので、 質問させていただきます。 まずは、下記のサイトを見ていただきたいのですが・・・ http://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2004h16_1/2004h16h_fe_pm_qs.pdf 平成16年度春期 午後の 19ページからの問5についてなのですが、 (1)  設問2についてなのですが、  ( b, c ) = ( ア, カ ) のところを、  ( b, c ) = ( カ ,ア ) と答えてしまいました。  これは、19ページの[システムの概要]の(1)より、  ニュースファイルのニュースのレコードは順ファイルの様式で  格納されているからでしょうか。   順ファイルというものが、よくわからないのですが、  インターネットで調べたところ、  「ファイルの先頭から、レコードを連続して記録。   格納効率は良いが、インデックスやキーがないので   特定のレコードへは直接アクセスできない」  と、ありました。  レコード単位で、先頭から見ていく、ということは、  「端末種別」の情報が、各レコードの最初のほうになければ、  結果出力処理で、「簡易」「詳細」の処理をわけられない。  ということでしょうか? (2)  基本情報技術者の午後試験の問5に出題される  ファイルとは、すべて、「データベースのファイル」を意味するのでしょうか?  午前の問題を解いていて、以前 「ファイル編成」についての問題を  解いたことがあったのですが、その中で、  「順編成」「直接編成」「区分編成」「索引編成」  という言葉が出てきたのですが、  主に、データベースのデータの格納の仕方をいうのでしょうか?  データベースの「CREATE INDEX ~ 」と「索引編成」  というのは、関係があるのでしょうか? なにぶんにもしろうとなので質問文の記述が拙いですが、 どなたか、教えていただけないでしょうか。 よろしくお願いします。

専門家に質問してみよう