基数整列法について教えてください(後編)

このQ&Aのポイント
  • 基数整列法について教えてください(後編)の要約文です。
  • 基数整列法には、数字を桁ごとに比較し、大小関係に基づいて整列する処理方法です。
  • 詳しい流れ図や関連URLは、こちらのサイトを参考にしてください。
回答を見る
  • ベストアンサー

基数整列法について教えてください(後編)

基数整列法について教えてください(前編)の続きです。 長文につき1投稿では入りきらないため、2回にわけております。 回答はこちら(後編)のほうにお願いいたします。 ちゃりお -------------------------------------------------------------------- 【流れ図】 端子:開始 │ 処理:3→桁数 │ ループ始端:桁ループ(桁数=1、桁数) │ │  ループ始端:山数クリア(山番号=0,9)  │  処理:0→山数(山番号)  │  ループ終端:山数クリア  │  │  ループ始端:分類ループ(番号=1、件数)  │  処理:ユーザ関数(番号、桁)→山番号・・・桁の数字を山番号に設定  │  処理:山数(山番号)+1→山数(山番号)/ データ(番号)→山(山番号、山数(山番号))  │  ループ終端:分類ループ  │  │  処理:0→番号  │  │  ループ始端:統合ループ(山番号=0,9)  │  │   ループ始端:転送ループ(数=1、山数(山番号))   │   処理:番号+1→番号/ 山(山番号、数)→データ(番号)   │   ループ終端:転送ループ  │  │  ループ終端:統合ループ │ │ ループ終端:桁ループ │ 端子:終了 関連URL: http://oshiete1.goo.ne.jp/kotaeru.php3?q=211604

  • chaz
  • お礼率65% (36/55)

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

  • ベストアンサー
  • minimum
  • ベストアンサー率46% (6/13)
回答No.1

>整列の様子は理解できるのですが ということなのでいきなり流れ図の説明からします まず変数の使われかたから データ(n):  元々のデータが入っています  整列後のデータもここに格納されます 山(山番号、山のデータ数):  整列のためにデータを分類する場所です  例えば、1桁目の数字で分類時の312は1桁目が2である数の3番目なので  (いわば「2組の出席番号3番、312君」)    山(2、3)=312    となるわけです。 山番号:  そのデータがどの山に入ればいいかを示す変数です 山数:  それぞれの山にデータがいくつ入っているかを示しています  つまり新しいデータを入れるときには    山数(山番号)+1→山数(山番号)  と、山数を一つ増やし    データ(番号)→山(山番号、山数(山番号))  と、そこにデータを入れればいいわけです 番号:  データ(n)の何番目を処理中かを示す数です。 では流れ図を見ていきましょう まず全体が ////////////////////////////////////// 処理:3→桁数 │ ループ始端:桁ループ(桁数=1、桁数) ////////////////////////////////////// ループ終端:桁ループ ////////////////////////////////////// の二つに挟まれています。 これは1桁目・2桁目・3桁目と同じ処理をしているだけです。 次にこの内部の先頭部分 //////////////////////////////////////////////////////////////// ループ始端:山数クリア(山番号=0,9)  処理:0→山数(山番号) ループ終端:山数クリア ループ始端:分類ループ(番号=1、件数)  処理:ユーザ関数(番号、桁)→山番号・・・桁の数字を山番号に設定  処理:山数(山番号)+1→山数(山番号)  処理:データ(番号)→山(山番号、山数(山番号)) ループ終端:分類ループ //////////////////////////////////////////////////////////////// は、データ(n)に入っている数値を全て山に移し替える作業をしています。 山数クリアループは分類ループの前処理として存在します。 これは山数を0にする事により(実際にはデータが残っていたとしても) 山の内部を空にします。 分類ループは全データに対して同じ処理をするループです。 「全データに対し」 「まずユーザ関数でどの山に入ればいいかを求め」 「その山の定員を1増やし」 「最後尾に入れてやる」 「…」 と読んでください。 次に後半部分 ///////////////////////////////////////////////////////////// 処理:0→番号 ループ始端:統合ループ(山番号=0,9)  ループ始端:転送ループ(数=1、山数(山番号))   処理:番号+1→番号   処理:山(山番号、数)→データ(番号)  ループ終端:転送ループ ループ終端:統合ループ ////////////////////////////////////////////////////////////// は、山の値を全てデータ(n)に戻す作業をします。 さっきと同じように番号を0にする事によってデータ(n)は空になりました。 こんどの6行は 「それぞれの山に対して」 「山の先頭から順番に」 「データ(n)の末尾の一個となりに」 「値を書き込んでいく」 「…」 「…」 と読んでください。

chaz
質問者

お礼

minimumさん、 配列のスケールをずっと小さくして(213、132、321)トレースしたら、並べ替えが成功しました。とりあえず補足でのやり方でいいんですね。たいへん助かりました。ありがとうございます。 ちゃりお

chaz
質問者

補足

minimumさん、 流れ図の解説、感謝いたします。理解をさらに深めることが出来ました。 4時間理解とトレースで格闘した挙句まだ行き詰まってしまいました(^^;どこで考え違いを犯しているのか、指摘いただけないでしょうか? [データ]6件 ※トレース用にデータ数を若干減らしてあります (1) (2) (3) (4) (5) (6) 423 121 231 232 253 312 [分類ループ] 桁ループ 分類ループ ユーザ関数 山数   山 桁数   番号    山番号   (山番号)(山番号、山数(山番号)) ===================================================================== 1    1     3     1    423 → 山(3,1)      2     1     2    121 → 山(1,2)      3     1     3    231 → 山(1,3)      4     2     4    232 → 山(2,4)      5     3     5    253 → 山(3,5)      6     2     6    312 → 山(2,6) [統合ループ&転送ループ] 統合ループ 転送ループ 番号 山(山番号、数)→データ番号 山番号   数 ===================================================================== 0     1     1  山(0,1) → データ (1)該当なし       2     2  山(0,2) → データ (2)該当なし       3     3  山(0,3) → データ (3)該当なし       4     4  山(0,4) → データ (4)該当なし       5     5  山(0,5) → データ (5)該当なし       6     6  山(0,6) → データ (6)該当なし 1     1     7  山(1,1) → データ (7)該当なし       2     8  山(1,2) → データ (8)121       3     9  山(1,3) → データ (9)231       4    10  山(1,4) → データ(10)該当なし       5    11  山(1,5) → データ(11)該当なし       6    12  山(1,6) → データ(12)該当なし

関連するQ&A

  • 基数整列法について教えてください(前編)

    いつもありがとうございます。 さて、午後のアルゴリズムの基数整列法の項ですが、整列の様子は理解できるのですが、流れ図がよく理解できません。お詳しい方、トレース等も含めてわかりやすく解説願えないでしょうか? よろしくお願いいたします。 ちゃりお ------------------------------------------------------------- 【配列】423、121、312、231、232、253、312、337 [8件] 【説明】2次元配列の「山(山番号、山のデータ数)」(山番号=0~9、山のデータ数=1~件数)に分類して、元の配列「データ(n)」(n=1~件数)に統合する。 【出典】基本情報[午後]完全合格教本/福島宏訓著/新星出版社(P40-41) 【整列の様子】 1桁目の数字で分類: 1の山 2の山 3の山 7の山  121 231 312 232 312 423 253 337 山を統合: 121 231 312 232 312 423 253 337 2桁目の数字で分類: 1の山 2の山 3の山 5の山 312 312 121 423 231 232 337 253 山を統合: 312 312 121 423 231 232 337 253 3桁目の数字で分類: 1の山 2の山 3の山 4の山 121 231 232 253 312 312 337 423 山を統合: 121 231 232 253 312 312 337 423 基数整列法について教えてください(後編につづく)

  • 古物商許可証について

    古物商許可証を取りましたが、 交付番号が3桁でこんな桁数の番号は有りますのか、 それと交付年月日が空欄です。 住所、氏名は記入されていましたが。 古物の種類は古本で申請しましたが、 扱い物の分類が記載されていませんが。 警察に聞こうにも、横柄で聞く気がしません。 宜しくお願い致します。

  • 電話番号のフォーマットについて

    Javaでアプリケーションを作成中です。電話番号のフォーマットチェックを実装しようとしていますが、そもそも一般的に (1) データベース側では番号だけを保持するのが普通なのでしょうか?(0311112222)それとも (2) ハイフン付で保持するのが普通でしょうか?(03-1111-2222) (1)の場合、画面表示時にハイフンを挿入することになると思いますが、携帯の場合、そうでない場合など処理が複雑になりそうです。(もしくは画面表示時にもハイフン抜きで表示する?) 現状は、あまり厳格にチェックする必要もないと思うので、(2)のやり方でやり、数字かハイフンかのチェックと最大の桁数チェック(11桁なのだろうか)だけしようかと考え始めましたが、何か不都合などあり得ますでしょうか?もし標準的な考え方があればと思い投稿致しました。ご意見あればお願い致します。 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • 基数の考え方。

    2進法の数字を16進法に変えたりする計算は、解けるのですが、その原理が解かりません。 基数変換を解かりやすく説明している書籍またはHPがありまあしたら教えて下さい。 よろしくお願いします。

  • SUBSTRING 関数に渡した長さのパラメータが無効です。

      ●サーバー機 DB:SQLServer2005 OS:WindowsServer2003 ●クライアント機 OS:WindowsXP SP3 住所テーブル(ADDRESS)の項目のひとつである電話番号(TELNO)を 特定の記号で3つの別項目として取得したいのですが クライアント機の SQL Server Management Studio にてクエリを実行すると 「SUBSTRING 関数に渡した長さのパラメータが無効です。」 以上のようなエラーが発生します。 電話番号の項目は文字型の項目で、実際のデータとしては 例:(01)2345-6789 (0123)45-6789 (01234)5-6789 こんな感じで市外局番の前後に必ず"(" ")"が付いており"-"も必ず付いた状態です。 ただし、市外局番、ハイフンの前後の番号の桁数に決まりはありません。 ※市外局番5桁、ハイフン前4桁、ハイフン後4桁という最大桁数の制限はあり。 【実行したクエリ】 Select SUBSTRING(TELNO, CHARINDEX('(',TELNO)+1, CHARINDEX(')',TELNO)-CHARINDEX('(',TELNO)-1) AS TELNO1 , SUBSTRING(TELNO, CHARINDEX(')',TELNO)+1, CHARINDEX('-',TELNO)-CHARINDEX(')',TELNO)-1) AS TELNO2 , SUBSTRING(TELNO, CHARINDEX('-',TELNO)+1, 5) AS TELNO3 From ADDRESS エラーメッセージの通り、SUBSTRING関数のパラメータの内容が長すぎるのが原因のようですが いろいろ調べてみたのですが別の書き方が見つけられず困っている状態です。 何かいい方法はないものでしょうか?(別の関数を使用する等々) ※ストアドプロシージャで処理するのではなく1本のクエリで結果が得られるのが望ましいです。 よろしくお願いいたします。

  • 基数と基数変換について

    この春初めて基本情報をうけます。 今勉強を始めたばかりでの初学者です。 2進数から10進数に変換の問題で質問です。 2進数の1.1011 と1.1101を加算した結果を10進数であらしなさい。 どうして2進数を足して11.1000になり答が3.5になるかわかりません。 教えて下さい。

  • シリアル番号検索を早くする方法

    office2016 (1)ORACLEからシリアル番号とその工事名称をexcelへインポート (2)シリアル番号に対する工事名称を確認して、作業工程のデータを作成 (3)作成した作業工程のデータをORACLEへ登録 というデータ作成をしています。 もともとは、(1)、(2)は無しで対応していたのですが、シリアル番号を手入力すると間違えるので、(1)、(2)の内容を追加しました。 登録されているシリアルの数が多い(4万件ほど)ので、先頭1桁目の文字列、先頭2桁目の文字列抽出、先頭3桁目の文字列抽出、先頭4桁目の文字列抽出をし、 あとは、先頭4桁で絞ったシリアル番号の集まりにして、その中からプルダウンメニューで対象のシリアル番号を特定させるという構成にしています。 シリアル番号の桁数は8桁。先頭4桁は英数文字、後半4桁はほぼ数字。若干英文字混じる。 MENUシート 工事番号の絞り込みとその工事番号の名称表示を実施 A13セル:シリアル番号1桁目を表示。入力規則 =SERIAL!$H:$H B13セル:シリアル番号2桁目を表示。入力規則 =SERIAL!$iI$I C13セル:シリアル番号3桁目を表示。入力規則 =SERIAL!$J:$J D13セル:シリアル番号4桁目を表示。入力規則 =SERIAL!$K:$K E13セル:8桁のシリアル番号表示。入力規則 =KOJI!$A:$A SERIALシート ORACLからインポートしたデータ表示 A列:シリアル番号 B列:工事名称 C列:シリアル番号の1桁目表示 D列:シリアル番号の2桁目表示 E列:シリアル番号の3桁目表示 F列:シリアル番号の4桁目表示 G2セル:MENUシートで先頭4桁の番号表示 =MENU!A13&MENU!B13&MENU!C13&MENU!D13 H列:インポートしたシリアル番号の先頭1桁目に使用されている文字列表示 I列:インポートしたシリアル番号の先頭2桁目に使用されている文字列表示 J列:インポートしたシリアル番号の先頭3桁目に使用されている文字列表示 K列:インポートしたシリアル番号の先頭4桁目に使用されている文字列表示 KOJIシート 先頭4桁で絞り込んだシリアル番号の集まりを表示する マクロ MENUシート Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Column = 1 Or Target.Column = 2 Or Target.Column = 3 Or Target.Column = 4) And Target.Row = 13 Then chushutsu Else End If 標準モジュール Sub chushutsu() Application.ScreenUpdating = False Sheets("KOJI").Select Columns("A:B").Select Selection.ClearContents Sheets("SERIAL").Select Range("G1") = "SERIAL" Range("G2") = "=MENU!R[11]C[-6]&MENU!R[11]C[-5]&MENU!R[11]C[-4]&MENU!R[11]C[-3]" ' Columns("A:B").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ Range("G1:G2"), Unique:=False ' Cells.Select Selection.SpecialCells(xlCellTypeVisible).Select Selection.Copy Sheets("KOJI").Select Range("A1").Select ActiveSheet.Paste ActiveWorkbook.Worksheets("KOJI").Sort.SortFields.Clear ActiveWorkbook.Worksheets("KOJI").Sort.SortFields.Add Key:=Range("A:A"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("KOJI").Sort .SetRange Range("A:B") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Sheets("SERIAL").Select ActiveSheet.ShowAllData Sheets("MENU").Select Application.ScreenUpdating = True End Sub 問題なのは、MENUシートのA13,B13,C13,D13セルでプルダウンメニューから文字を選択する度にマクロが動作するのに、若干時間がかかること。 シリアル番号を検索するのに、基本、先頭1桁目から順番に絞り込みます。 なので計算方法を手動にしておき、先頭1桁目から3桁目まではマクロ動作させず、4桁目を指定した後にマクロ実行するという手もありますが、後から2桁目の文字だけ変更して別のシリアル番号検索という場合もあるので対応できません。 CTRL+Fで工事番号を手入力して検索したらすぐに探せますが、手入力は面倒なので、先頭4桁の文字をプルダウンで特定して絞り込むという構成のままで検索時間の短縮が図れる構成としたいです。 マクロに関してはベタで教えていただきたく。

  • 基数変換について教えてください。

     基数変換について以前から少し疑問に思っいた点があるので教えてください。例えば10進数の56を2進数に直すと111000になります。しかし、16進数の38から2進数に直すと4桁ずつ計算する癖がついているので00111000とかいてしまいます。この2つは桁数でいうと前者が6桁、後者が8桁で表されているだけで、結局は同じ事を意味していると思うのですが、例えば参考書の答えでは、しっかりと00111000と書いてあります。この桁数というのは重要なのでしょうか?答えの時111000としてしまっては間違えになるのでしょうか?よろしくお願いします。

  • 基数変換わからない・・。

    16進数を10進数に変換するプログラムをVBで作成しているのですが、どうしても計算途中でオーバーフローしてしまいます・・。最大で16進数64桁のものを計算するにはどのようにコーティングすればいいのでしょうか・・?どなたかご教授ください。

  • 16進数の基数について教えてください

    今情報処理の勉強をしています。 10進数の基数は10なのも2進数の基数が2なのもわかりますが、16進数の基数が10(イチゼロ)とはどういうことなのでしょうか。この0はどこから来たのですか?仕組みをいまいち理解するのが難しいです。 ご教授いただけませんか。

専門家に質問してみよう