アプリ版:「スタンプのみでお礼する」機能のリリースについて

VASICで「n個の整数を入れて、それを小さい順にならべまた、ちょうど真ん中の整数を出す」というプログラムを作っています。たとえば、「4,3,5,7,8」、と入力したら「3,4,5,7,8」と出てきて真ん中は「5」です。というような感じです。n個が偶数のときは真ん中の二つのどちらかでいいです。初心者で3つぐらいまでならなんとかできそうなんですが・・。結構いきづまってます。お願いします。

A 回答 (3件)

バブル ソート


セレクション ソート
シェル ソート

についてのVBのサンプルが、MicrosoftのHPで公開されています。
このサンプルは1001個のランダムな数字の収められた配列を、各ソートプログラムに渡し、実行経過時間を測定するようになっております。
実証として、シェルソートが一番早いようです。



以下のプログラムをサンプルプログラムの
> MsgBox "イミディエイト ウィンドウで結果をご確認ください"
の下に追加してください。

  Dim minNum As Long
  Dim maxNum As Long
  Dim cntAry As Long
  Dim lngAryCenter  As Long
  Dim lngCenter    As Long
  
  '配列要素数を得る
  minNum = LBound(vTemp3)
  maxNum = UBound(vTemp3)
  cntAry = maxNum - minNum + 1
  
  '(1)と(2)のどちらかを使用する
  '(1)配列の真中を求める(配列が偶数個の時、二つ存在する真中の小さい数の方の値を求めるとき)
  lngAryCenter = (cntAry + 1) \ 2 '小数点切り捨て
  '(2)配列の真中を求める(配列が偶数個の時、二つ存在する真中の大きい数を方の値を求めるとき)
  lngAryCenter = Int((cntAry + 1) / 2 + 0.9) '小数点切り上げ

  
  '配列要素が1から始まるとは限らないので、そのずれを補正
  lngCenter = lngAryCenter + (minNum - 1)
  
  '中央値の表示
  MsgBox "中央の値は「" & lngAryCenter & "」番目の[" & vTemp3(lngCenter) & "]です"



これでセンターの値が求められます。

ソートのアルゴリズムは説明できるほど詳しくないので書きませんが、先に述べられているように[ソート][アルゴリズム]で検索をかけたら、あちこちの大学の研究室のHPで詳しく記されています。


かすかな記憶ですが・・・ぼくが大学のとき、バブルソートが一番早いと習ったはずなのですが・・・
違ったのかなぁー

参考URL:http://www.microsoft.com/japan/support/kb/articl …
    • good
    • 0

nこの変数が有り、ソートをして、真ん中の要素を出力すればよいのですが。



3個の要素であれば出来ると言うのは、forを使わない処理ですか?
であればforの使い方を学習しましょう。

中央の要素の求め方は簡単ですよね?
    • good
    • 0

ソート(並べ替え)を行って、配列中の n/2 番目のデータを取得すればいいですよね。



ソートに関しては、アルゴリズムの本を読めば少なくとも数種類の方法が載っているはずですので、好きなものを使えばいいでしょう。

とりあえず、最も理解しやすいと思われる「バブルソート」を使って造ってみました。

Private Sub Command1_Click()
  Dim Data(255) As Long
  Dim i As Long, j As Long
  Dim tmp As Long
  
  'データを乱数で初期化する
  Randomize Timer
  For i = 0 To 255
    Data(i) = Rnd * 1000
  Next i
  
  'データを並べ替える
  For i = 0 To 254
    For j = 0 To 254 - i
      If Data(j) > Data(j + 1) Then
        tmp = Data(j)
        Data(j) = Data(j + 1)
        Data(j + 1) = tmp
      End If
    Next j
  Next i
  
  'ちゃんとソートできてるか確認
  For i = 0 To 255
    Debug.Print Data(i) & " ";
  Next i
  Debug.Print
  
  
  '中間値を得る
  MsgBox "中間は " & Data(255 / 2) & " です。"
End Sub

こんな感じです。
バブルソートについては、ネットで検索をかけてみると沢山ヒットすると思いますが、例えばコレ↓とか。

http://www.soi.wide.ad.jp/class/97001/slides/04/ …


尚、上のプログラムはかなりヘタレです(^^;
同じバブルソートをするにしても、もっと高速なプログラムはいくらでもあります。
加えて、中間値を求めるのであれば、全部ソートする必要も無いですしね。

興味があれば、市販の「アルゴリズム辞典」などをご覧下さい。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!