• 締切済み

配列のソート 

使用ソフト VB.NET 配列に入っている値の大きい順にソートする 値は重複することもある。その場合は配列の値が若いほうを優先 具体的には ロト6にて、出現した番号が多い順番にソートしたい。 date_last_st() には出現回数 date_sort() には出現回数が多い番号が順番にいれる 例 date_last_st(1)=2 date_last_st(2)=5 date_last_st(3)=2 の場合 date_sort(1)は2 date_sort(2)は1 date_sort(3)は3 となるようにしたい 一応自分で考えたのですがもっと簡素にできたりはしないのでしょうか? ---------------- Do For i = 1 To 43 If date_last_st(i) > date_max Then date_max_no = i date_max = date_last_st(i) End If Next date_last_st(date_max_no) = 0 date_sort(c) = date_max_no date_max = 0 c = c + 1 '1番~43番まですべて0か 判断 For i = 1 To 43 If date_last_st(i) = 0 Then date_TF = True Else date_TF = False Exit For End If Next '1番~43番まですべて0なら無限ループを抜ける If date_TF = True Then Exit Do End If Loop ---------

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

Array.Sort メソッドを使ってはどうでしょうか? Array.Sort で実装されているのは、クイックソートで、これは、安定ではない(元の順序を保存しない)ですが、単なる数値のデータの場合、同じ値の時に元の順序を保存することは意味がないように思います。

  • agricap
  • ベストアンサー率40% (79/195)
回答No.1

抽出済みのものをゼロにしてしまうと、最初からゼロであったもの との区別ができませんから、よくありません。ここでは-1を使って みます。 また、外側のループは必ず43回まわると全部抽出できることが わかっているので固定で書きます。 For c=1 To 43      date_max = -1   For i=1 to 43     If date_last_st(i) > date_max Then       date_max = date_last_st(i)       date_max_no = i     End If   Next   date_last_st(date_max_no) = -1   date_sort(c) = date_max_no Next

関連するQ&A

  • VB6での配列の SORT の使い方 

     お世話になります。   下記のように、配列にランダムな数値を入れて、それを昇順、降順にしたいのですが、この場合の SORT の使い方を教えて欲しいです。  Dim YUI(100) As Integer   YUI(1) =88:YUI(2) =53:YUI(3) =7 ~ YUI(98) =13:YUI(99) =2:YUI(100) =94 下記のような並べ替えをしていますが、SORT を使った場合の書き方を教えて下さい。 Dim I1,I4,D7 As Integer For I1 = 1 To 100 - 1 For I4 = I1 + 1 To 100 If YUI(I1) < YUI(I4) Then D7 = YUI(I4) YUI(I4) = YUI(I1) YUI(I1) = D7 End If Next I4 Next I1

  • 構造体配列のクイックソート

    こんにちわ。 構造体配列のリストを ポインタのつなぎ変えによるクイックソートで 以下のようなソートをしたいのですが、悩んでおります。 struct info { int count; struct info *prev; struct info *next; }; int main () { struct info info[5]; /* 初期値設定 */ quick_sort(info, 0, 5); return 0; } 上記のようにして、クイックソートをしたいのですが、 よくあるクイックソートだと 例えば初期値を <配列のindex>要素の値を <0> <1> <2> <3> <4> 5 1 4 3 2 などと定義した場合 普通のクイックソートだと <0> <1> <2> <3> <4> 1 2 3 4 5 というように並び変えられてしまい <配列のindex>と 要素の値の組み合わせが変わってしまいますが、 この組み合わせを変えず、 struct info *if; if = info; for (i=0; i<MAX; i++){ printf("%d", if->count); if = if->next; } printf("\n"); とすることで、indexとしては昇順になっていないが *nextをたどっていくことでちゃんと目的の値の昇順になっている というのを実現したいのですが、ポインタのつなぎ変えか何かが 間違っているようで うまいことできていません。 どなたかご教授いただけますでしょうか。 申し訳ありませんが、よろしウお願いいたします。

  • excelVBA 配列ソート方法

    こんにちは、 下記のコードを使ってsetint配列の値を 昇順にソートしようとしているのですが、 最小値が最後に来てしまいます。 何か昇順にソートする方法はないでしょうか。 '昇順並び変え For run = 1 To UBound(setint) For run1 = UBound(setint) To 1 Step -1 If setint(run) >= setint(run1) Then swap = setint(run) setint(run) = setint(run1) setint(run1) = swap End If Next Next For run = 1 To UBound(setint) Debug.Print setint(run) Next

  • マージソート

    マージソートの実行時間を測定するプログラムを書いています。 コンパイルの時にはエラーが出ないのですが、実行するとコマンドプロンプトが強制終了されます。 どこが悪いか、どう直せばいいのか指摘していただけないでしょうか? よろしくお願いします。 ~qtime.c~ //マージソート実行用プログラム //bcc32 mtime.c merge.c m1.c sfmt.c #include <stdio.h> #include <stdlib.h> #include <time.h> #include "sfmt.h" #define MAX 5000 void merge_sort(int a[], int start, int end); main() { int i , x[MAX] , n; time_t start , end ; int sn; printf("適当な数字の入力 : "); scanf("%d", sn); init_gen_rand(sn); for(i=0; i<MAX; i++) x[i]= (gen_rand32()% MAX);; n=MAX; start = clock(); //測定対象プログラム merge_sort(x, 0, n-1); end = clock(); printf("sort\n"); for(i =0 ; i < n ; i++ ) if ( i == i/100*100) printf("%d\n" , x[i]); printf ("実行時間: %f sec\n" , (double)(end-start) /CLOCKS_PER_SEC); return 0; } ~merge.c~ int b[100]; void merge_array(int x[], int start, int end) { int mid, i, j, k; mid = (start + end) /2; i = start; j = mid + 1; for(k = start; k <= end; k++){ if(x[i] > x[j] && j <= end || i > mid){ b[k] = x[j]; j++; } else{ b[k] = x[i]; i++; } } for(k = start; k <= end; k++){ x[k] = b[k]; } } ~m1.c~ void merge_array(int x[], int start, int end); void merge_sort(int a[], int start, int end); void merge_sort(int a[], int start, int end) { int mid; if(start >= end) return; mid = (start + end) / 2; merge_sort(a, start, mid); merge_sort(a, mid + 1, end); merge_array(a, start, end); }

  • 1次元配列のソート方法

    配列のソートメソッドについて質問させていただきます。 VB.NET初心者なので日本語がおかしいかもしれませんが、宜しくお願いいたします。 データテーブルが格納されている配列があり、 その配列をソートしたいと思っています。 データテーブルの中に「NO」と「ID」というフィールドがあります。 NOで昇順し、NOが同じだったらIDの昇順でソートといったことがしたいのですが、 条件によっては上手くいきません。 よろしければ、教えていただけないでしょうか? また、もっと効率の良い方法とかありましたら、具体的はソース等教えていただけないでしょうか? 宜しくお願いいたします。 [例] workDT() ← 元のデータテーブル配列 Dim Datatable(workDt.Rows.Count-1) As DataTable ← ソート後のデータテーブル配列 Dim tmpDatatable(workDT.Rows.Count-1) As DataTable ← 途中で使うデータテーブル配列 Dim NO(workDT.Rows.Count-1) As Integer ← 元のデータテーブル配列の各「NO」フィールドを格納する配列 Dim ID(workDT.Rows.Count-1) As String ← 途中で使うデータテーブル配列の各「ID」フィールドを格納する配列 Dim Index(workDT.Rows.Count-1) As Integer ← インデックスに使用 ' IDでソート For i = 0 To workDt.Length - 1 ID(i) = workDt(i).Rows(0).Item("ID") Index(i) = i Next ' 配列をIDでソート Array.Sort(ID, Index) ' ソート後配列をテンプ配列に格納 For i = 0 To workDt.Length - 1 tmpDatatable(i) = workDt(Index(i)).Copy Next ' NOでソート For i = 0 To tmpDatatable.Length - 1 NO(i) = tmpDatatable(i).Rows(0).Item("NO") Index(i) = i Next ' 配列をNOでソート Array.Sort(NO, Index) ' ソート後配列を格納 For i = 0 To tmpDatatable.Length - 1 Datatable(i) = tmpDatatable(Index(i)).Copy Next これで各配列を初期化します。 workDTに5つのデータテーブルが入っていて workDT(0):ID=3、NO=1 workDT(0):ID=1、NO=5 workDT(0):ID=2、NO=5 workDT(0):ID=4、NO=5 workDT(0):ID=5、NO=7 (IDは重複不可設定、NOは重複可設定です。) とした場合、NOのソートのところで変な順番になってしまいます。 Array.Sort(NO, Index) このメソッドは同じ値だった場合、何を優先してソートしているのでしょうか? 環境はWindowsXPSP3とVB2005です。

  • 配列をソートさせたとき、もう一方の配列も同じようにソートさせたい

    タイトルが意味不明で申し訳ありません。 二つの配列があるとします。 片方には文字列、もう片方には数値が記録されているもので、最大添え字は同じです。 この数値の大きい順に並べ替えを行いたいのですが、 name[0]とcount[0] name[1]とcount[1] ・ ・ をペアで並べ替えたいのですが、その方法が分かりません。 sort関数を使うとどうしても片方のみしかソートできないし、バブルソートを用いて試みましたが、どうも並び替えられません。 連想配列を使う考えもありましたが、2つの配列をどうやって一つのハッシュに格納すればいいか分からず断念しました。 バブルソートの方にバグがあるのかもしれませんが、何か方法があればご教授いただけると幸いです。 よろしくお願いします。 バブルソート部分のソース(配列は@filelistと@countを使用) # ソート処理 for($i=0;$i<$#filelist;$i++){ for($j=0;$i<$j;$j++){ if($count[$i]<$count[$i+1]){ $tmp=$count[$i]; $count[$i]=$count[$i+1]; $count[$i+1]=$tmp; $tmp=$filelist[$i]; $filelist[$i]=$filelist[$i+1]; $filelist[$i+1]=$tmp; $k=$j; } $i=$k; } }

    • ベストアンサー
    • Perl
  • 二次元配列のソートについて

    PHPでデータベースの複数のテーブルから ID、名前、かな、点数といったデータを 読み込んでテーブルに保存しています。 SELECT id, name, kana, tensu FROM a, b, c ORDER BY tensu といった形で出来ると思っていたのですが エラーが出てできませんでした。 そこで各テーブルのデータを 読み込んで二次元配列にしてソート してみたのですが、なぜか以下のソースだと データが重複されて表示されて 困っています。 $saidai = count($tbl); for ($i=0 ;$i<$saidai;$i++){  $sort[$i] = $i; } for($i=0;$i<$saidai;$i++){  for($j=0;$j<$saidai;$j++){   if($tbl[$sort[$i]][2] > $tbl[$sort[$j]][2]){    $work = $sort[$i];    $sort[$i] = $sort[$j];    $sort[$j] = $work;   }  }  表示 } こんな感じですがどうも繰り返しても 同じデータばかりが表示されます。 いろいろ試してみましたが結局出来ませんでした。 表示するデータがかぶらないようにするには どうすればよろしいですか? お願いいたします。

    • ベストアンサー
    • PHP
  • マクロ 修正 (初心者です)

    Option Explicit Private lastRow As Long Private Index As Integer Private Sub CommandButton1_Click() Unload Me End Sub Private Sub あいまいボタン_Click() Dim last As Long If 検索名前テキストボックス.Text = "" Then MsgBox "あいまい抽出する名前を入力してください。" Exit Sub End If last = Range("A500").End(xlUp).Row Range("A2:D" & last).AutoFilter Field:=2, Criteria1:="=*" & 検索名前テキストボックス.Text & "*" End Sub Private Sub UserForm_Activate() Dim i As Long lastRow = Worksheets("顧客情報").Cells(Rows.Count, 1).End(xlUp).Row + 1 If lastRow <= 3 Then Exit Sub End If For i = 4 To lastRow 名前リストボックス.AddItem Cells(i, 2) Next End Sub Private Sub 検索ボタン_Click() Dim searchName As String searchName = 検索名前テキストボックス.Text If searchName = "" Then MsgBox "検索する名前を入力してください。" Else Dim i As Long Dim no As Long For i = 0 To 名前リストボックス.ListCount - 1 If 名前リストボックス.List(i) = searchName Then no = i 名前リストボックス.ListIndex = no Exit For ElseIf i >= 名前リストボックス.ListCount - 1 Then MsgBox "該当なし。" Exit For End If Next Index = no + 3 Rows(Index).Select End If End Sub B列に名前を入力しています B3から検索してくれるマクロを作成しました(インターネット見ながら) 別の検索も作りたくてどこをいじればいいのかわからず書き込みました G3列(住所を検索)から下側を検索したいのですがどこをいじればいいでしょうか?

  • クイックソート

    #include<stdio.h> #include<stdlib.h> #define MAX 10 int comp(const void *i,const void *j); int main(void) { int sort[MAX], i ; for(i=0 ; i<MAX ; i++){ sort[i] = rand(); } qsort(sort, MAX, sizeof(int), comp); for( i=0; i<MAX ; i++) printf("%d\n", sort[i]); return 0; } int comp (const void *i, const void *j) { return *(int*)i - *(int*)j; } これはクイックソートのプログラムなのですが、 int comp (const void *i, const void *j) { return *(int*)i - *(int*)j; } この部分がわかりません。ここでソートしているのですか?

  • 【Excelマクロ】もっと頭の良い書き方って無いかな?

    5行空白列があったらそこで処理を終わりたいんですが、もっといい書き方はないでしょうか? 下記が私の考えた頭の悪いやり方です。 Sub macro() Dim i As Integer For i = 1 To 1000 If Cells(i, 1) = "" Then  If Cells(i + 1, 1) = "" Then   If Cells(i + 2, 1) = "" Then    If Cells(i + 3, 1) = "" Then     If Cells(i + 4, 1) = "" Then      If Cells(i + 5, 1) = "" Then       MsgBox (i - 1 & "行目で終わりです")       Exit For      End If     End If    End If   End If  End If End If Next End Sub

専門家に質問してみよう