• 締切済み

n番目に大きい数を求めるアルゴリズム(C言語)

ky072の回答

  • ky072
  • ベストアンサー率60% (85/140)
回答No.4

No.3 の方もおっしゃっていますが、 まず、n=0については出題者に確認した方が良いでしょう。 それから「入力に同じ値が複数存在する可能性があるか」や、 同じ値が複数存在した場合の「n番目に大きい数」の定義も 確認した方がいいでしょう。 例えば 100, 100, 90, 90, 80, 50 というデータが許容されるか、 許容された場合に「3番目に大きい数」は 90 なのか 80 なのか。 これによって少し実装が変わるはずです。 回答ですが、No.1 の方もおっしゃっているように、 「上位n個の数値を保持する方法」をベースにできます。 「下位n個」とありますが、「上位n個」ですよね? それを前提に話を進めます。 上位n個の配列を維持するのに、 ソートは絶対に必要ではありません。 n個全てを並び替えてしまうとソートになりますが、 実際に必要なのは配列内のn個の要素の中で、 最小の要素がどれであるかを知ることだけです。 配列内のn個のそれぞれの要素について、 他の全要素と比較し、 それが最小の要素であるかをチェックしてマークします。 最小がどれであるかを知るだけで、並び替えはしません。 入力に対しての処理はこうなります。 入力が配列内の最小の要素よりも大きい場合には、 最小の要素と入れ替えます。 そしてまた最小の要素を見つけなおします。 こうして最後のデータまで処理を終えれば、 配列内の最小の要素=「n番目に大きい数」になります。 つまり、配列には出現した順にデータを詰めていき、 どの要素が最小値であるかをマークするだけにすることで、 ソートを回避するわけです。 配列内の最小値よりも小さいデータは捨て、 最小値よりも大きいデータが来たら入れ替えるのです。 結果、配列内の順序はぐちゃぐちゃなままで、 「n番目に大きい数」が求められることになります。

関連するQ&A

  • ソートアルゴリズム

    お忙しいところすいません。 先日授業で出された課題がどうしても分からなかったので教えていただきたいと思っています。 どうやってプログラムを作ればよいでしょうか。 問題は、 『N件の乱数データを用意し、昇順(または降順)に並べる。 データ件数、ソート所用時間を表示する。 ソート時間1~100秒で処理できるデータ件数を確認する。 ソートアルゴリズムは2種以上作成すること。』 です。

  • クイックソート

    N個のデータを降順に並び替えるプログラムをクイックソートで書きたいのですがよく分かりません。アルゴリズムの部分をどなたか教えてください。できれば詳しい説明もお願いします。

  • クイックソートでソート数が1個や2個でも正しくソートできるのでしょうか?

    使用上意味がないのですが、クイックソートでソート数が1個や2個でも正しくソートできるのでしょうか? 引数に quick_sort( a[], 0, n - 1 )と、n-1となっているために nは0は無理そうですが、n=1なら0でうまくいくかなと思うのですが、 原理上、どうなっているのでしょうか? 詳しい方教えて下さい。 http://www.daccho-it.com/program/algo/quick.c

  • C言語でのソースファイル

    n個の整数データを入力し、最後に平均を出力 nは最初に入力する(nは自然数) 平均は小数部まで求める 実行例として 入力するデータ数は? 3 NO. 1 :12 NO. 2 :7 NO. 3 :4 以上3個の平均 :7.666667 こんな感じにしたいのですができません どなたか教えてください。 お願いします。

  • アルゴリズムプログラミング

    アルゴリズムにおいて以下のような課題が出たのですかその実行結果を出すためのソースプログラム、または実行結果をどなたか教えてください! (1)バブルソート、選択ソート、挿入ソートプログラムに対して、実行時間(小数点以下2桁まで)、比較回数、代入回数をデータ数50000、100000、150000、200000の4つの場合でそれぞれ測定せよ。ただし対象データはランダム関数SFMTを利用して作成するものとする。 (2) ヒープソート、クイックソートとマージソートプログラムの実行時間(小数点以下2桁まで)、比較回数、代入回数をデータ数50000、100000、150000、200000の4つの場合でそれぞれ測定せよ。ただし対象データはランダム関数SFMTを利用して作成するものとする。 SFMTは以下のサイトからSFMT-srcー1.3.3.zipをダウンロードして解凍する。 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index-jp.html#SFMT そのうち必要なファイルは sfmt.h sfmt.c sfmt-params.h sfmt-params19937.h を使用する。 どうぞよろしくお願いします。

  • C言語で、配列の要素を削除したい

    構造体からなる配列において、 データを追加/削除したいのですが、 どうしたらいいのでしょうか? 学校の課題なのですが、問題から読み取る限り リスト構造じゃなくて配列でつくるみたいなのです。。 追加データ数は限られてるので、数はだいじょうぶと 思うのですが、データを消したあと その消した部分をどうやってつめればいいですか?? また、数字を追加/削除した後に数字のならびを ソートして昇順にそろえなければいけないのですが、 バブルソート法では遅いでしょうか? (それしか習ってないのですが) 何かもっと早くできる方法があれば教えていただきたいです。 どうかよろしくお願いします!

  • サンプル数について

    今N個のデータがあって、そのデータを分析したいと 思っています。 しかし、N個全部調べると大変なので、そこから無作為に 抽出してn個のデータを調べたいと思います。 nはどのくらいの数値にすればいいのでしょうか? 高校の確率統計の教科書を見てもいまいちわかりません。 (もう32歳ですが・・・) 一応数学については得意なほうです。 よろしくお願いします。

  • バブル・ソート、クイック・ソート

    N個(N=4,5,6)のデータが全て等しいデータ列(例えばN個の数字全部が1のとき)をバブルソートで並び替えたとき、データの交換回数は何回か。また、同じデータ列をクイックソートで並び替えたときはどうか。 という問題があるのですが、どう比較するのかがわかりません。詳しい方、説明よろしくお願いします。

  • N連立方程式の解き方を教えてください。

    N連立方程式の解き方を教えてください。 未知:  n個の2次元ベクトル: {a_i | i=1,...,n }  なお、すべて大きさは1です。 |a_i| = 1 for all i  n個のスカラー: { λ_i | i=1,...,n }  ※ 未知数は 3n 個ありますが、ベクトルの大きさの条件から実際には 2n 個です。 既知:  n×n 個の 2x2 行列: {A_ij | i,j = 1,...,n } 問題:  以下の n 本の連立方程式から a_i と λ_i の値を出す。 i = 1,...,n に対して    A_i1 a_1 + A_i2 a_2 + ... + A_in a_n = λ_i a_i  (左辺は2次元ベクトルの和ですので、実際には 2n 本の   連立方程式になり、未知数と同数になります。) 考察:  n 個の λ_i が全部同じなら固有値問題に帰着できますが、  そうではなく、また、右辺が非線形なので困っております。 反復的な近似解法でも結構ですので、ご教授いただければ幸いです。 よろしくお願いします。

  • [データ構造・アルゴリズム]ソーティングについて

    以下の空欄に入る言葉がわからないのでどなたか教えてください. n個のデータをソートすることを考える.n個のデータの大小関係は(1)通りある.1回の比較操作で,上手くいけば比較対象のデータは1/2になる.従って,k回の比較操作で,比較対象のデータは(2)になる.従って,k回の比較操作で全てのデータの大小関係を知るためには,(3)という関係が必要である. 2を底とした両辺の対数をとるとk≧log(n!)という関係が成立する. Stirlingの公式 n!≒√2πnn^ne^(-e)を利用して log(n!) = (中略) = n log n - n log e + 1/2 log(2πn)となる. このうち(4)に比べて他の項は急速に小さくなるので,最終的には log(n!) ≒ n log n と考えてよい.つまり,並べ替えには最低(5)の計算の手間が必要であることがわかる. 自分で考えた答えは (1)log(n!) (2)n^-k (3)k ≧ log(n!) (4)n log n (5)n log n なのですが・・・どうでしょうか?非常に困っているので,よろしくお願いします!