• 締切済み

クイックソート

たびたびすいません。 この10個の乱数をクイックソートで表示するには どのようなソースを加えればよいでしょうか? <% Do while x<10 x=x+1 Randomize Response.Write( CInt((Request.Form("max"))-CInt(Request.Form("min"))+1) * Rnd + CInt(Request.Form("min"))) Response.Write("<br>") loop %>

みんなの回答

回答No.1

10個なのにあえてクイックソートを使うのですか? バブルソートで十分な気もしますが。 とりあえず乱数を配列に格納して、参考URLで作成してください。

参考URL:
http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/quick-sort.html

関連するQ&A

  • 改行したいのですが

    ASP初心者です。 乱数を発生させ10個、表示させたいです。 ひとつ表示したら改行し、10行で表示するには どのようにしたらよいですか? 下のソースだと10個並んででできてしまいます。 <% Do while x<10 x=x+1 Randomize Response.Write( CInt((Request.Form("max"))-CInt(Request.Form("min"))+1) * Rnd + CInt(Request.Form("min"))) loop %>

  • クイックソートの交換回数

    クイックソートを行うプログラムを書いています。 これを、比較回数と交換回数を表示できるように改良したいのですが、うまくいきません。カウントする場所は間違えてないと思うのですが、出力の場所が悪いせいか、大量の出力結果が表示されます。 うまく表示させる方法を教えてください。 ~time.c~ #include <stdio.h> #include <stdlib.h> #include <time.h> #include "sfmt.h" #define MAX 5000 void quick_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(); //測定対象プログラム quick_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; } ~quick.c~ #include <stdio.h> int hikaku = 0, koukan = 0; int divide_array(int x[], int start, int end) { int i, j, tmp; i = start; j = end -1; while(1){ while(x[i] < x[end])i++; hikaku++; //比較カウント while(x[j] > x[end] && j>i)j--; hikaku++; //比較カウント if(i >= j) break; tmp = x[i]; x[i] = x[j]; x[j] = tmp; koukan++; //交換カウント i++; j--; } tmp = x[i]; x[i] = x[end]; x[end] = tmp; printf("比較回数: %d\n", hikaku); printf("交換回数: %d\n", koukan); return i; } ~quick2.c~ int divide_array(int x[], int start, int end); void quick_sort(int a[], int start, int end); void quick_sort(int a[], int start, int end) { int s; if(start >= end) return; s = divide_array(a, start, end); quick_sort(a, start, s-1); quick_sort(a, s+1, end); }

  • C言語のクイックソートについて

    下記のようなクイックソートのプログラムをコーディングしたのですが、比較回数・挿入回数・シフト回数をそれぞれ知りたいのですが、どこにそれぞれのカウンタを挿入すればよいでしょうか? よろしくお願いします。 void quick(int a[],int left,int right) int i; int pl=left; int pr=right; int pivot; int tmp; pivot=a[(pl+pr)/2]; do{ while(a[pl]<pivot) { pl++; } while(a[pr]>pivot) { pr--; } if(pl<=pr) { swap(&a[pl],&a[pr]); pl++; pr--; } } while(pl<=pr); if(left<pr) { quick(a,left,pr); } if(pl<right) { quick(a,pl,right); } } void swap(int *x,int *y) { int temp; temp=*x; *x=*y; *y=temp; }

  • クイックソートの可視化プログラムを考えています

    いつもお世話になっております。 当方、理系の学部に在籍中の学生です。 OpenGLを用いてクイックソートを可視化するためのプログラムを考えております。 まず、ソーティングしたい整数配列の要素ひとつひとつを単色の四角形で表現し、数が大きいほど明るく、小さいほど暗くなるよう設定しました。 イメージとしては、Rキーを押す度にソーティングがワンステップずつ進み、徐々に綺麗なグラデーションが出来上がっていく様子を表示させたいのですが、ここが上手くいかず困っております。問題点をご指摘いただけるとありがたいです。 以下、ソースコードの一部となります。 /* ソートする配列 */ int nums[] = {94, 43, 59, 57, 23, 27, 25, 22, 55, 21, 44, 28, 65, 30, 75, 13, 23, 89, 84, 71, 45, 68, 28, 31, 75, 62, 70, 34, 87, 20, 96, 47, 80, 74, 81, 30, 22, 55, 11, 34, 85, 16, 71, 41, 28, 26, 25, 47, 14, 55}; int n = 50; int flag = 0; /* 表示コールバック関数の一部 */ void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLineWidth(5.0); for(int i = 0; i < n; i++) { glColor3f(0.0, 0.0, nums[i] * 0.01); glBegin(GL_POLYGON); glVertex2f(0.0, 0.0 + 0.5 * i); glVertex2f(2.0, 0.0 + 0.5 * i); glVertex2f(2.0, 0.5 + 0.5 * i); glVertex2f(0.0, 0.5 + 0.5 * i); glEnd(); } /* キーボードコールバック関数の一部 */ case 'r': flag = 1; break; case 'q': /* クイックソートする */ QSort(nums, 0, n - 1); break; /* クイックソートを行う */ void QSort(int x[], int left, int right) { int i, j; int pivot; i = left; /* ソートする配列の一番小さい要素の添字 */ j = right; /* ソートする配列の一番大きい要素の添字 */ pivot = x[(left + right) / 2]; /* 基準値を配列の中央付近にとる */ while (1) { /* 無限ループ */ while (x[i] < pivot) /* pivot より大きい値が */ i++; /* 出るまで i を増加させる */ while (pivot < x[j]) /* pivot より小さい値が */ j--; /* 出るまで j を減少させる */ if (i >= j) /* i >= j なら */ break; /* 無限ループから抜ける */ Swap(x, i, j); /* x[i] と x[j]を交換 */ while (flag == 0) glutPostRedisplay(); i++; /* 次のデータ */ j--; flag = 0; /* flag更新 */ } if (left < i - 1) /* 基準値の左に 2 以上要素があれば */ QSort(x, left, i - 1); /* 左の配列を Q ソートする */ if (j + 1 < right) /* 基準値の右に 2 以上要素があれば */ QSort(x, j + 1, right); /* 右の配列を Q ソートする */ } /* 配列の要素を交換する */ void Swap(int x[ ], int i, int j) { int temp; temp = x[i]; x[i] = x[j]; x[j] = temp; }

  • java(バブルソート/単純挿入ソート)

    以下のプログラムを「バブルソートもしくは単純挿入ソートのプログラムに変更しなさい」という課題が出ました。 どのようにすればよろしいでしょうか? import java.util.*; public class SelectSort { //プログラムクラス名 //整列プログラム public static void main(String[] args){ //整列用 int 型配列 int[] target; int elems = KeyboardInput.askInt("要素数? "); //配列を乱数で初期化する target = setArray(elems); //初期状態を表示 display(target); //整列メソッドの呼び出し sortArray(target); //整列結果の表示 display(target); } //配列を乱数で初期化するメソッド static int[] setArray(int elems){ // 要素数個の int 型変数の確保 int[] array = new int[elems]; //乱数利用ための宣言 Random generator = new Random(); //乱数の最大値・最小値 int max = 100; int min = 0; //generator.nextDouble() で 0から1までのdouble型乱数発生 for(int i=0 ; i<array.length ; i++) { array[i] = (int)((max-min)*(generator.nextDouble())+min); } return array; } //配列の状態を表示 static void display(int[] array){ for(int i=0 ; i<array.length ; i++) { System.out.print(array[i]+" "); } System.out.println(""); } static void sortArray(int[] array){ //配列のはじめから最後まで繰り返す for( int i = 0; i < array.length-1 ; i++){ int min_id = i; int min = array[i]; //範囲中でもっとも小さい要素を探す for( int j=i+1 ; j< array.length ; j++ ) { if( array[j] < min ){ min = array[j]; min_id = j ; } } //範囲の始めと置き換える int tmp = array[i]; array[i] = array[min_id]; array[min_id] = tmp; //display(array); } } }

  • 確認画面を出す

    こんにちは。早速ですが現在下記のようなメールフォームを作成しているのですが、 <% 'On Error Resume Next If Len(Request("name")) = 0 then Response.Write "お名前が入力されていません。" & "<br>" Response.Write "前ページへ戻るボタンを押して下さい。" & "<br>" Response.Write "<br>" Response.Write "<input type='button' value='前ページへ戻る' onclick='JavaScript:history.go(-1);'>" & "<br>" ElseIf Len(Request("mail")) = 0 then Response.Write "メールアドレスが入力されていません。" & "<br>" Response.Write "前ページへ戻るボタンを押して下さい。" & "<br>" Response.Write "<br>" Response.Write "<input type='button' value='前ページへ戻る' onclick='JavaScript:history.go(-1);'>" & "<br>" ElseIf Len(Request("message")) = 0 then Response.Write "お問い合わせ内容が入力されていません。" & "<br>" Response.Write "前ページへ戻るボタンを押して下さい。" & "<br>" Response.Write "<br>" Response.Write "<input type='button' value='前ページへ戻る' onclick='JavaScript:history.go(-1);'>" & "<br>" else 'メール送信 Set bobj = Server.CreateObject("basp21") ' ASP svname = "xxxx" ' <== smtp サーバマシン名 mailto = "xxxxx" ' 宛先 mailfrom = "xxxxx" '差出し人 subj = "お問い合わせフォームより" ' 件名 body = "お名前      :"& Request("name") & vbCrLf _ & "電話番号     :"& Request("phone") & vbCrLf _ & "メール      :"& Request("mail") & vbCrLf _ & "お問い合わせ内容 :"& Request("message") & vbCrLf file = "" rc = bobj.SendMail(svname,mailto,mailfrom,subj,body,file) if rc <> "" then ' エラーチェック 'エラー! Response.Write "エラーで送信できませんでした。" & rc & "<br><br>" else Response.Write "お問い合わせありがとうございました。" & "<br>" Response.Write "メールを確認次第ご連絡させていただきます。" & "<br>" end if end if %> ここで入力させた内容を一度確認画面を出して、送信を行いたいと思うのですが、フォームの引き継ぎ方が分かりません。 どうぞ皆様のお力をお貸し下さい。 宜しくお願いします。

  • ASPでの引数の配列渡しについて

    下記のようなコードで検証してみました。 関数の内部に配列を渡すことには成功しているようですが、関数内で書き換えを行っても元の配列には反映されません。 こういうことは「できない」と解釈していいのでしょうか? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Dim n(10) Dim a(10) n(0) = 1 n(1) = 2 a(0) = "a" test(n) test(a) response.Write("n(0)=" & n(0) & "<br>") response.Write("n(1)=" & n(1) & "<br>") response.Write("a(0)=" & a(0) & "<br>") response.Write("a(1)=" & a(1) & "<br>") Sub test(byref x) response.Write("ubound=" & UBound(x) & "<br>") response.Write("x(0)=" & x(0) & "<br>") response.Write("x(1)=" & x(1) & "<br>") x(0) = x(0) & x(0) x(1) = x(1) & x(1) End Sub

  • 降順ソートができません。

    テキストボックスを画面左側に10個作成します。 テキストボックスを画面右側に10個作成し、 降順ソートボタンを作成します。 左側10個に入力された数値データを降順ソートして 右側の10個のテキストボックスに表示してください。 <?php //配列 $naNumber[0] = $_POST[naNumber0]; $naNumber[1] = $_POST[naNumber1]; $naNumber[2] = $_POST[naNumber2]; $naNumber[3] = $_POST[naNumber3]; $naNumber[4] = $_POST[naNumber4]; $naNumber[5] = $_POST[naNumber5]; $naNumber[6] = $_POST[naNumber6]; $naNumber[7] = $_POST[naNumber7]; $naNumber[8] = $_POST[naNumber8]; $naNumber[9] = $_POST[naNumber9]; //読込 echo ("<form name = naNumberList method = POST action = ./php05.php>"); echo ("<table boder = 1><tr><td>"); //入力用テキストボックスの作成 //テキストボックス名・形式(右寄せ)・配列 echo ("<input type = text name = naNumber0 style = text-align:right; value = $naNumber[0]><br> <input type = text name = naNumber1 style = text-align:right; value = $naNumber[1]><br> <input type = text name = naNumber2 style = text-align:right; value = $naNumber[2]><br> <input type = text name = naNumber3 style = text-align:right; value = $naNumber[3]><br> <input type = text name = naNumber4 style = text-align:right; value = $naNumber[4]><br> <input type = text name = naNumber5 style = text-align:right; value = $naNumber[5]><br> <input type = text name = naNumber6 style = text-align:right; value = $naNumber[6]><br> <input type = text name = naNumber7 style = text-align:right; value = $naNumber[7]><br> <input type = text name = naNumber8 style = text-align:right; value = $naNumber[8]><br> <input type = text name = naNumber9 style = text-align:right; value = $naNumber[9]> </td>"); //降順にソート rsort($naNumber); //降順ソート表示用テキストボックス //テキストボックス名・形式(右寄せ)・読込専用・配列 echo ("<td><input type = text name = naNumber0 style = text-align:right; readonly value = $naNumber[0]><br> <input type = text name = naNumber1 style = text-align:right; readonly value = $naNumber[1]><br> <input type = text name = naNumber2 style = text-align:right; readonly value = $naNumber[2]><br> <input type = text name = naNumber3 style = text-align:right; readonly value = $naNumber[3]><br> <input type = text name = naNumber4 style = text-align:right; readonly value = $naNumber[4]><br> <input type = text name = naNumber5 style = text-align:right; readonly value = $naNumber[5]><br> <input type = text name = naNumber6 style = text-align:right; readonly value = $naNumber[6]><br> <input type = text name = naNumber7 style = text-align:right; readonly value = $naNumber[7]><br> <input type = text name = naNumber8 style = text-align:right; readonly value = $naNumber[8]><br> <input type = text name = naNumber9 style = text-align:right; readonly value = $naNumber[9]> </td></tr>"); //降順ソートボタン作成 echo ("<tr><td colspan = 3 align = left> <input type = button value = '降順ソート'> </td></tr> </table> </form>"); ?> 上記のソースで、テキストボックス表示・降順ソートボタン表示までできました。 しかし、降順ソートができません。。 降順ソートの書き方をいろいろ変えてみたのですが。 どなたかご存知であれば教えてください!お願いいたします。

    • ベストアンサー
    • PHP
  • 高精度乱数関数

    rand()の値をRAND_MAX+1で割ると、[0, 1)の範囲になりますよね。 もし、RAND_MAX+1が2の乗数なら、浮動小数において結果は丸め誤差を含んでいないはずですよね。 unixのgccでコンパイルしたのですが、RAND_MAXの値は32767だったので、 #define (RM RAND_MAX + 1) #define RND ((long double)rand()) long double x; x = RND / RM + RND / RM / RM + RND / RM / RM / RM + RND / RM / RM / RM / RM ・ ・ ・; とすれば、精度の高い[0, 1)区間の乱数関数を作ることはできますか? この論理に間違いがあれば指摘してください。

  • 複数集計をしたい

    こんにちは。http://www.ken3.org/を参考にしながら、下記までたどり着いたのですが、 <% QA = -1 If Request.QueryString("a4") = "on" Then QA = 4 If Request.QueryString("a3") = "on" Then QA = 3 If Request.QueryString("a2") = "on" Then QA = 2 If Request.QueryString("a1") = "on" Then QA = 1 If Request.QueryString("a0") = "on" Then QA = 0 If QA >= 0 Then Call test108_WRITE(QA) Call test108_SUM() Else %> <FORM ACTION="*****.asp" METHOD="GET"> <table width="500" border="0" cellspacing="2" cellpadding="2"> <tr> <td><font size="2">Q.しつもん</font></td> </tr> <tr> <td><font size="2"> <INPUT TYPE="checkbox" NAME="a4"> ああああ</font></td> </tr> <tr> <td><font size="2"> <INPUT TYPE="checkbox" NAME="a3"> いいいいい</font></td> </tr> <tr> <td><font size="2"> <INPUT TYPE="checkbox" NAME="a2"> ううううう</font></td> </tr> <tr> <td><font size="2"> <INPUT TYPE="checkbox" NAME="a1"> えええええ</font></td> </tr> <tr> <td><font size="2"> <input type="checkbox" name="a0"> おおおおお</font></td> </tr> </table> <br> <br> <INPUT TYPE="submit" VALUE="送 信"> <INPUT TYPE="reset" VALUE="入力クリア"> </FORM> <% End If %> <% Sub test108_WRITE(QA) Set objFS = Server.CreateObject("Scripting.FileSystemObject") Set ts = objFS.OpenTextFile(Server.MapPath("*****.txt"), 8, True) ts.write QA & "," ts.write strMSG & "," ts.write Now & "," ts.write Request.ServerVariables("REMOTE_ADDR") & "," ts.write Request.ServerVariables("HTTP_USER_AGENT") ts.write chr(13) & chr(10) ts.close Response.Write "<font size=2>ご協力ありがとうございました。</font><br><br>" Response.Write "<font size=2>Q.しつもん</font><br>" Call test016_SUM() End Sub Sub test016_SUM() dim strRECORD dim nCNT(10) dim nSUM nSUM = 0 For i = 0 to 10 nCNT(i) = 0 Next Set objFS = Server.CreateObject("Scripting.FileSystemObject") Set ts = objFS.OpenTextFile(Server.MapPath("*****.txt"), 1, true) Do While ts.AtEndOfStream = False strRECORD = ts.ReadLine i = Cint(Left(strRECORD, 1)) nCNT(i) = nCNT(i) + 1 nSUM = nSUM + 1 Loop ts.close strBOX = Array("おおおおお" , "えええええ" , "ううううう" , "いいいいい" , "あああああ") Response.Write "<table cellspacing=0 cellpadding=0 border=0>" Response.Write "<br>" For i = 4 To 0 Step -1 Response.Write "<tr>" Response.Write "<td align=left width=200px><font size=2>" & strBOX(i) & "</font></td>" strMSG = FormatNumber(CInt((nCNT(i) / nSUM) * 200), 1) Response.Write "< td background=img/graphbg.gif align=left width=200px><font size=2> <img src=img/graphbar.gif width=" & strMSG & " height=13>< /font></td>" strMSG = FormatNumber((nCNT(i) / nSUM) * 100, 1) Response.Write "<td align=right width=50px><font size=2>" & strMSG & "%</font></td></tr>" Response.Write "</tr>" Next Response.Write "</table>" End Sub %> これだと「型が一致しません。: 'Cint'」という表示が出てなかなかうまくいかず手詰まりの状態になってしまいました。 皆様のお力をお貸し下さいませ。宜しくお願い致します。

専門家に質問してみよう