• ベストアンサー

クイックソート

クイックソートには再帰を使わない方がいいんですか? 再帰を使わないとすると明示的にスタックで管理することになると思うのですが,整列させたい要素数がバラバラの時はどのようにすればよいですか?

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> クイックソートには再帰を使わない方がいいんですか? もともと再帰的な考え方なので、無理に再帰を使わない、というメリットはあまり無い、と 思います。 一昔前のコンピュータでは、関数の呼び出しにかかる時間でさえ惜しいので、非再帰の アルゴリズムも考えられていますけど。 逆にいうと、VB では関数やサブルーチン呼び出しにはかなりのコストがかかる(*)ので あれば、非再帰のアルゴリズムを使うこともあり、かな。   (*) 私は、VB嫌いなんで、よく知りません > 再帰を使わないとすると明示的にスタックで管理することになると思うのですが, > 整列させたい要素数がバラバラの時はどのようにすればよいですか? 大きめに持っておくか、動的に(実行時に)確保するしかありません。 大きめに、と言っても log2(要素数)くらいの大きさで良いのですから、さして気にする こともないでしょう。 VB って、配列のサイズを実行時に決められないんですか? 別に配列じゃなくても、整数が保持できる「コレクション(って言うんだっけ?)」でも良いんですけど。 # すいません、VB 知らなくて

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.3

再帰呼び出しが可能な言語なら、 作りやすさの点で再帰を選ぶのがいいと思いますが。 関数呼び出しのオーバーヘッド等が問題になることもありますが、 まれなケースでしょう。 あと、かってに使われるスタックサイズ等が問題になるケースもあるかも知れませんが、 これも特殊なケースでしょう。 昔のBASIC,FORTRAN等では局所的な自動変数はない、 再帰呼び出しは許されていない等で、 非再帰にするしかなかったですけど(^^;;

全文を見る
すると、全ての回答が全文表示されます。
  • josyo_m
  • ベストアンサー率63% (28/44)
回答No.1

お疲れ様です。 下記のURLにサンプルが載っていました。 間違っていたらごめんなさい。

参考URL:
http://www.geocities.co.jp/SilkRoad/4511/vb/sort.htm
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • クイックソートで・・・

    C言語で再帰を利用してクイックソートを書いたのですが、データ数が大きくなるとプログラムが途中で終了してしまいます。これってスタック領域がなくなってしまったからでしょうか?お願いします。

  • クイックソートについて

    下記のソースプログラムのquick_sort_coreの部分がわかりません。 わかる方助けてください。 あとこのソースを降順にした場合の変更点も教えていただけると助かります。 #include <stdio.h> /* printf()利用のため */ #include <stdlib.h> /* rand()利用のため */ #include <time.h> /* clock()利用のため */ #define N 10 /* 整列対象要素数 */ /** * 配列の中身を表示する関数 * @param a 表示する配列 * @param n 配列の要素数 */ void print_array(const int a[], int n) { int i; for (i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n"); } /** * 整列されているかどうか確認する関数 * @param a 確認対象配列 * @param n 配列の要素数 */ void is_sorted(const int a[], int n) { int i; for (i = 0; i < n - 1; i++) { if (a[i] > a[i + 1]) { printf("昇順に整列されていません\n"); return; } } printf("昇順に整列されています\n"); } /** * クイックソートの本体 * @param a 整列対象配列 * @param l 対象の最初の要素番号 * @param r 対象の最後の要素番号 */ void quick_sort_core(int a[], int l, int r) { /* ここを実装する */ } /** * これまでの整列関数のインターフェースにあわせるクイックソート呼び出し関数 * @param a 整列対象配列 * @param n 配列の要素数 */ void quick_sort(int a[], int n) { quick_sort_core(a, 0, n - 1); } int main(void) { int i; int n = N; /* 整列対象要素数 */ int a[N]; clock_t start,end; /* 0からRAND_MAXの一様乱数をn個生成し、配列aに格納 */ for (i = 0; i < n; i++) { a[i] = rand(); /* 出力確認(print_array)するときは a[i]=rand()%100 としておくと見やすい */ } /* 昇順にソートされているか確認(デバッグ用) */ is_sorted(a, n); /* 配列の中身を確認(デバッグ用) */ print_array(a, n); /* 開始時刻の取得 */ start = clock(); /* クイックソート関数の呼び出し */ quick_sort(a, n); /* 終了時刻の取得 */ end = clock(); /* 配列の中身を確認(デバッグ用) */ print_array(a, n); /* 昇順にソートされているか確認(デバッグ用) */ is_sorted(a, n); /* 実行時間の表示 */ printf("%d 個の要素のクイックソートの実行に %f [秒]かかりました\n", n, (double)(end - start) / CLOCKS_PER_SEC); return 0; }

  • クイックソート

    クイックソートのアルゴリズムの問題で 9 1 8 5 3 4 2 6 7 と上記のようなデータ列を昇順に整列するときに 9 1 8 5 3 4 2 6 7 6 1 8 5 3 4 2 9 7 6 1 2 5 3 4 8 9 7 とここで詰まってしまうんですけどどうしたら昇順に導けますか?

  • Double型ソート方法

    お世話になります。 VB初心者ですが宜しくお願いします。 ソートについてなのですが、Double型の配列(要素数8191)をソートしたいのですが処理が早いソート方法はあるのでしょうか。 クイックソートで試してみたのですがスタック領域が不足しています。 とのエラーメッセージが表示され処理が停止します。 スタック領域を消費しないソート方法などあればご教授宜しくお願いします。

  • クイックソートで並べ替え

    友人から情報処理の質問を受けました。ですが、私では良く分からなかったので質問します。 2,4,8,1,6,5,2,7,3,7の整数をクイックソートで並べ替えよ。 また、比較回数を示せ(軸要素は先頭の2要素のうち大きいほうとせよ)。 よろしくお願いします。

  • クイックソートでソート数が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

  • シェルソート,クイックソート

    シェルソートは比較数が小さいとクイックソートよりも早いですが,なぜでしょうか?

  • アプレットのクイックソート分割について教えて下さい

    JAVA アプレットでクイックソートの基本的な仕組みである分割についてのアプレットを作成したく色々と調べているのですが,再帰呼び出しを使ってソートするクイックソートの情報は沢山あるですが, 中央値を用いて中央値より大きいグループAと中央値よりも小さいグループBというように二つのグループに分ける分割のアプレットのサンプルプログラムは探していますが見つかりません. 分割について詳しいかたがいましたら情報を下さい, 宜しくお願いします.

  • 100枚のカードの整列にクイックソート法でおよそ5分かかるとき200枚

    100枚のカードの整列にクイックソート法でおよそ5分かかるとき200枚のカードを同じ方法で整列すると およそ どれくらいの時間がかかるか 100枚のカードの整列の単純ソート法でおよそ5分かかるとき、200枚のカードを同じ方法で整列するとおよそ どれくらいの時間がかかるか 以上2点について教えてほしいです。また、答えの導き方も教えていただければ幸いです。

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

    以下の数字を用いて・・・・ num[10] = {21, 46, 87, 9, 32, 33, 57, 87, 12, 43} クイックソートで整列する時,データの入れ替え状況,配列の内容の変化について,データの入れ替え過程をプログラムでない形で説明をお願いします。アルゴリズムの特徴がわかる説明と入れ替え過程を示してほしいです。 以下の数字を用いてお願いします。 例: ●●で分割: {                    } ●●で分割: {                     }           ・           ・           ・           ・ 整列後: {                     }