• ベストアンサー

qsortの先頭のqの意味

C言語の関数にqsortというのがありますが最初のqはどういう意味でしょうか 順番に並べ替えるだけならsortでいいと思うのですが、どういう経緯でqが先頭についているのでしょうか

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

もともとはクイックソートの意味だったはず. 今では全くもって無意味ですが.

nanako_04
質問者

お礼

> 今では全くもって無意味ですが. そういうことなのですね。 ありがとうございました。

その他の回答 (3)

回答No.4

glibcによると、"The qsort function derives its name from the fact that it was originally implemented using the “quick sort” algorithm. "と書いてあるので、やはりquick sortのqだと思います。 http://www.gnu.org/s/hello/manual/libc/Array-Sort-Function.html#Array-Sort-Function しかしながら、C99の規格を見るかぎり、何のアルゴリズムを使うかは規定されていませんね。qsortが規格化されたC89の規格を閲覧することはできませんでしたが、元々はquick sortだったけれど、関数の仕様で具体的なアルゴリズムまで規定する必要はないのでその縛りを外したということかもしれません。

nanako_04
質問者

お礼

> 元々はquick sortだったけれど、関数の仕様で具体的なアルゴリズムまで規定する必要はないのでその縛りを外したということかもしれません。 わかりました。 ありがとうございます。

回答No.2

クイックソートだからです。 http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=qsort&dir=jpman-9.0.2%2Fman§=0 マニュアルを見ると分かる通り、この他にheapsort、mergesort、radixsortもあります。 詳しい話はアルゴリズムの教科書にまかせますが、それぞれ得手不得手があるのでそれを理解した上で使うとよいでしょう。

nanako_04
質問者

お礼

えーと、これは特定の環境でのマニュアルですよね?

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

たしかクイックソート(quick sort)のqだったかと。

nanako_04
質問者

お礼

必ずしもクイックソートではないという話を聞いたことによる疑問です。 初期のころはクイックソートで実装されていたということでしょうか。

関連するQ&A

  • 二次配列のqsortですが

    Cの初心者ですがよろしくおねがいします。 二次配列をqsortでソートしたいのですがまだソートする前の順番も記憶したいのですがどうすればいいのでしょうか 分かる方にはぜひ教えていただきたいのです! 例えばcount[j][i]をqsortでソートし、昇順で並べ変えた後のiの元の順番に対して今の順番も記憶する場合でお願いします.

  • qsortの関数

    qsortで昇順や降順にする用に関数を書き換えたり出来ますが・・ linuxで言う[sort -u [ファイル名]]のように 同じ文字列を見つけたときに 同じ行を削除するにはどうしたらよいのでしょうか? たとえば qwer asdf zxcv tyui ghjk vbnm asdf zxcv とファイルがあったとすれば ソート後 重なっている asdf zxcv を一行にまとめて表示したいのです。 linuxコマンドで言うまさに sort -u です。この場合「-u」が普通のソートと違うところだと思っています。 qsortで指定する関数を書けばいいのでしょうか? 詳しくお願いします。

  • qsort のアルゴリズムについて

    現在Solaris上で作られたソフトウェアをwindowsに乗せ換えるポーティング作業を 行っているのですが、qsortの結果が一致せずに困っています。 比較関数で判定できる範囲は一致するのですが、比較関数が一致するデータ同士の順番が 一致せず、その結果出力される生成物の内容が異なってしまいます。 (同じ生成物が作成されなければポーティング作業完了と成りません) 多分qsortのアルゴリズムの違いだと思うのですが、Solarisのqsortのアルゴリズムがわかる方 いらっしゃいませんか? Solarisのコンパイラは以下の通り Sun WorkShop Compiler Csparc 5.0 出来ればqsortのソースコードが有ればよいのですが、軸要素の決定方法だけでも解れば 幸いです。 いくつか、公開されているアルゴリズムを試してみたのですが、一致する物は有りませんでした。 (Windowsのソート結果とも違いました) 因みに、Windowsの開発環境は、 Microsoft Visual Studio 10.0 です。

  • qsortについて

    qsort()で構造体をソートする時に、qsortの第3,4引数時の、「size t_t size, int (*cmp)(const void *a, const void *b)」の使い方が分かりません。 何故これを使ってソートが出来るのでしょうか?そもそも、構造体を送った時に、自作関数内での書き方にも疑問があります。 int main(void){ MAX dt[5]={・・・・}; //構造体変数宣言 ・・・・・ qsort(dt,5,sizeof(MAX),sum); //(*1) .... return 0; } int sum(const void *a, const void *b){ MAX *p1 = (MAX *)a; //(*2) MAX *p2 = (MAX *)b; //(*2) ・・・・ return ~; } ---------------------------------------------------- *1: 第3引数のsizeof(MAX)って何ですか? *2: 例えばint型が渡されてreturnする場合は、「return *(int *)a - *(int *)b 」でいいのに、   何故構造体の場合はこう書かないといけないのですか?

  • qsortについて

    『独習C』を使って勉強しているのですがqsortの部分で *(int*)i - *(int*)j という文が出てくるのですが、この意味がよく分かりません ##演算子の使い方も分からないので、どなたか分かる方 回答お願いします。

  • 構造体のソートの記述について

     C言語で自己参照構造体(beforeとnextで繋げてます)で名簿をつくり、年齢で昇順ソートをしようと考えています。  そこで、ソート関数の「qsort」というものを使ってソートしたいのですが、どのように使ったらいいのでしょうか?  参考例などがありましたら、教えていただけますか?  よろしくお願いします。

  • qsortを用いた構造体配列のソート

    お世話になります。 http://simd.jugem.jp/?eid=116 を参考にqsortを用いた構造体配列のソートをC言語で記述しようとしています。 上記のページは、構造体のメンバが配列でない場合です 今回は、メンバが配列のときの構造体配列のソートを実現したいと思っています。 つまり、 typedef struct{ int a; int b[1024]; int c[1024]; }TEST; という構造体配列があって、 TEST base[256]; と宣言し、メンバの配列の添え字を基準としてソートしたいときには、どのようにqsortを用いれば良いのでしょうか、ということです。 どうしたらよいかわからず途方にくれています。 つまり、下のようなソートが行われるには、どのようなプログラムを書けばいいかということです。 構造体でソートするものとします。 構造体でソートできれば、qsortを使っていなくても構いません。 プログラムの得意な方がおりましたら、ご教授下さい。 <ソート前> //************************************************ test[ 0].b[0] = 3; test[ 1].b[0] = 102; ... test[255].b[0] = 1; ------------ test[ 0].b[1] = 99; test[ 1].b[1] = 200; ... test[255].b[1] = 2; ------------ ... ------------ test[ 0].b[1023] = 99; test[ 1].b[1023] = 9; ... test[255].b[1023] = 200; //************************************************** <ソート後>:test[x]ではなく、b[y]を基準としてそれぞれのくくりをソートしたい //************************************************ test[ 0].b[0] = 1; test[ 1].b[0] = 3; ... test[255].b[0] = 102; ------------ test[ 0].b[1] = 2; test[ 1].b[1] = 99; ... test[255].b[1] = 200; ------------ ... ------------ test[ 0].b[1023] = 9; test[ 1].b[1023] = 99; ... test[255].b[1023] = 200; **************************************************

  • qsortの引数について

    以下のプログラムがあります。 int compare( const char **name1, const char **name2 ) { return strcmp( *name1, *name2 ); } int main( void ) { char *names[] = { "rand", "calloc", "malloc" }; int num = sizeof names / sizeof names[0]; qsort( names, num, sizeof( names[0] ), (int (*)(const void *, const void * ))compare ); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~この部分 return 0; } 上の「~~~」の上の部分のqsort関数の第4引数のキャストの意味が 分かりません。なぜ関数の前に引数が書かれるのでしょうか? またintの後にある(*)は「int型のポインタ」と言う意味なのか、 compare関数のポインタなのかも分かりません。 ご回答よろしくおねがいします。

  • main関数を先頭に置くデメリット

    C言語で、main関数を先頭に置き、他の関数はプロトタイプ宣言だけ済ませて mainの後に置くという書き方に何かデメリットはあるのでしょうか。 何かの書籍で、「mainは先頭に置く方が何かと良い」と書いてあったので気になっています。

  • qsortの関数ポイントについて

    qsortの関数ポイントについて int int_cmp(const int *a, const int *b) { ------ } main { qsort(x,nx,sizeof(int),(int (*) (const void *, const void * )) int_cmp); 上記の(1)関数のポイント,(int (*) (const void *, const void * )) int_cmpを  普通の(2)関数ポイント(* int_cmp) (const void *, const void * )で呼べない  理由 、また、(1)(2)は、同じ意味でしょうか、教えて頂きたい。

専門家に質問してみよう