C言語なら俺に聞け 146

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 839f-AnMQ)
垢版 |
2018/04/30(月) 04:47:37.50ID:XX4FB8lc0
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/


C言語なら俺に聞け 144
https://mevius.5ch.net/test/read.cgi/tech/1514025223/

次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
-
※前スレ
C言語なら俺に聞け 145
http://mevius.5ch.net/test/read.cgi/tech/1519046038/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
499デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/29(日) 12:50:28.71ID:LQAkWqzt0
むしろあっちでもこっちでも
オレは間違った回答は一切してないからな

すべてカンペキなレスだ

知恵遅れがテキトーなこといってるのは
あっちもこっちも同じ
2018/07/29(日) 12:57:17.34ID:Rgaf8fSN0
>>469
そりゃvolatileも万能ではないよ
最終的に確認するのは実機デバッグしかない
アセンブラで直接叩くしか解決できない場合もある
ICEで直接追跡しながらプログラムコードとチップの動作を確認するのが組み込みシステムの開発
ただしvolatileすら使わないのでは無駄に書き替え工数が膨れ上がる
最低限の対応はあらかじめ取っておくべき
2018/07/29(日) 12:57:38.10ID:Rgaf8fSN0
間違えた
>>498
2018/07/29(日) 13:10:28.41ID:x0a0gOqsM
>>498
このスレの誰もが真っ先にキミを駆除したがってるのに、天才のはずのキミが気づいてない?おかしいねぇ
503デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/29(日) 13:14:35.44ID:LQAkWqzt0
クソニートのたまり場から
クソニートを駆除するだけだからな

部屋にいる人間の数より
南京虫やダニやノミの数のほうが多い
そういうスレだ
バルサン焚かないとなまともな人間がよりつかなくなる

その南京虫やダニやノミみたいなオマエを駆除するといってるわけ
わかった?
2018/07/29(日) 13:26:52.38ID:OHU95624d
>>500
今時、
SFRにアクセスする道具は整ってる
Cで書ける

標準の環境でない場合だけ心配すればいい
2018/07/29(日) 14:46:05.01ID:u6NN385t0
>>500
volatileの機能は明確に定義されていて
万能だとか頭の悪そうな話は必要ない

実機でデバッグしてコンパイラのバグが発覚することはあって
そのときの状況によってはアセンブラを使うこともあるが
アセンブラで「叩く」って言葉遣いは変だぜ
石を叩くのはCでもできるしな

ところで、おまえさんのところでは
JTAGじゃなくICEって言うのか
2018/07/29(日) 15:04:54.06ID:Rgaf8fSN0
>>505
インサーキットエミュレータ(In Circuit Emulator:ICE)だな
もっともC言語でプログラム組んでたのは7,8年前までだけどな
当時はルネサス変更前のNECの78K0や東芝のTLCS780、松下(パナソニック)のMN101なんかで組み込み開発をやってた
2018/07/29(日) 15:12:25.34ID:h14Y8Y+4d
volatileだって書いた通りに動く
コンパイラが信用できないときは逆アセンブルして確認する
実機デバッグしなければならないのは書いたやつが信用できないからで
volatileだからじゃないね
あとjtagはインターフェースのことでデバッガ自体は
ICEと呼ぶかな、うちも
2018/07/29(日) 15:40:41.02ID:OHU95624d
volatileをつけてコンパイラが(一見)正しいコードを生成しても
CPUが順番を変えて実行したりする

マルチコア、OoO時代は
同期コードを自分で書くのは色々な意味でやめた方が良い
SFRアクセスには使えるが
2018/07/29(日) 15:52:36.85ID:OHU95624d
>>507
本来の意味のICEなんて絶滅寸前
510デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/29(日) 17:56:25.83ID:VgN+++E0a
夏はアイスだよね〜
2018/07/29(日) 17:57:28.24ID:+KuOy2bC0
割り込み禁止って今のOSだと無意味?
2018/07/29(日) 18:45:23.92ID:Ga4xmacd0
>>511
普通に使ってると思うけど?
2018/07/29(日) 19:38:18.03ID:u6NN385t0
ユニプロセッサからマルチプロセッサへパラダイムシフトするにあたって
1つのCPUだけ割り込み禁止してもどうたらって話だろ
514デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/29(日) 20:17:45.56ID:VgN+++E0a
>>511
それはOS上で動くプログラムの受け取るシグナルの話?
それなら特定のやつ以外は禁止したり自分でハンドら書いたりできるわけだが。
そういう話ではない?
515デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/29(日) 20:20:49.84ID:LQAkWqzt0
もしかして
ハードウェア割込とソフトウェア割込の違いすら分かってないのが
レスしてんのか
516デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/29(日) 20:25:27.65ID:LQAkWqzt0
そもそもデバイスがCPUより超遅いことが分かってないようなのが
一瞬で値が変わってたのが、それが変わらなくなったらどうすんのとかいってるレベルだからな

ホントなコイツラの程度がイロイロと知れるわ
517デフォルトの名無しさん (スップ Sd52-SJhd)
垢版 |
2018/07/29(日) 20:25:43.86ID:QevJM+ENd
いい加減秋田
2018/07/29(日) 20:35:45.02ID:2vtczMQ4M
>>513
どの割込みの話ししてるのか良くわからんけど、デバイスからの割り込みって予め指定したプロセッサが受け取る実装が多いぞ
2018/07/29(日) 20:44:07.76ID:YD8oKrYq0
良くわからん人は素直に>>508の通りにしなさい
ここで一言で語れるような内容じゃないから
2018/07/29(日) 20:44:37.09ID:YD8oKrYq0
特に半角君
521デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/29(日) 20:47:29.08ID:LQAkWqzt0
低学歴知恵遅れがドヤ顔で書いてるOoOの問題なんか
分かった上でオレはカンペキなレスしてるからな
522デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/29(日) 20:48:20.64ID:LQAkWqzt0
もうねドヤ顔でレスしてるヤツの知能レベルが
致命的に低いワケ
2018/07/29(日) 20:50:38.73ID:YD8oKrYq0
完璧なヤツが遅いとか速いとか
ハード割り込みとかソフト割り込みとか
まったくとんちんかんwww

書けば書くほど痛い
524デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/29(日) 20:51:15.80ID:LQAkWqzt0
はい低学歴のレス頂きました
525デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/29(日) 20:52:18.31ID:LQAkWqzt0
レスで簡単に判定できる
コイツはクソニート
コイツは低学歴

超簡単
2018/07/29(日) 20:55:32.94ID:u6NN385t0
ソフトウエア割り込みとかバカかw
センズリ野郎
527デフォルトの名無しさん (ガックシ 06ab-SJhd)
垢版 |
2018/07/30(月) 16:36:28.63ID:3BqaNEe76
キーボードから実数値を入力
3件のみを値が多い順に出力
最初にデータの件数(3件以上で、最大で100件とする)を入力
100件を超える場合、「エラー」と出力

ソートを使うみたいです。よろしくお願いします。
2018/07/30(月) 17:03:31.87ID:hdlApzlBd
int i, num, array[100];
printf("Number of numbers: ");
scanf("%d", &num);
for (i = 0; i < num; ++i)
{
printf("array[%d]: ", i);
scanf("%d", &array[i]);
}
...
2018/07/30(月) 17:04:07.39ID:hdlApzlBd
比較関数をqsortに渡せ。
2018/07/30(月) 17:56:36.84ID:n1wK/LR00
アレ? 蟻のarrayはint配列だけど、問題で要求してるのは実数値じゃね?
2018/07/30(月) 18:03:34.93ID:ehNSvi3pM
値が大きい順なのか
値の出現回数が多い順なのか
2018/07/30(月) 18:12:03.23ID:6ITjo5O70
arrayをdoubleかfloatの配列にしてくれ。すまん。
533デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/30(月) 18:38:36.45ID:xHVHgAPAa
夏休みの宿題か・・・
2018/07/30(月) 18:47:55.30ID:6X4H9pr00
floatならscanf/printfともに%f
doubleならscanfは%lfでprintfは%f
535デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/30(月) 18:57:52.63ID:xHVHgAPAa
100件入力しても最初の3件だけを大きい順ではなく多い順に並べると・・・
変な宿題だな。読み間違えてないか?
2018/07/30(月) 19:07:25.93ID:Ei1MMj+i0
入力データに重複を許し、その出現数をカウントしろとか?
2018/07/30(月) 19:26:58.25ID:aSIGzv/D0
上位3件
2018/07/30(月) 19:27:37.61ID:aSIGzv/D0
だろ
普通に考えて
539デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/30(月) 19:28:21.43ID:xHVHgAPAa
3件しかデータがないのに多い順となるとその内2件が同じ値でなければできない。
3件とも違うとか、あるいは3件とも同じなら並べかえる必要がない。
更に配列の先頭の二つが同じなら並べ変える必要がない。
それは既に多い順になっている。または全て同じ値だ。

とすると二番目の値と三番目の値を比較し、同じだったら最初の値と三番目の値を入れ換えれば良い。
三つとも全て同じ値の時に無駄な入れ換え処理をすることになるが、この程度はよかろう。
540デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/30(月) 19:29:45.17ID:xHVHgAPAa
>>537
知らんがな。
2018/07/30(月) 19:37:02.99ID:aSIGzv/D0
「3件のみを」は「出力」にかかる
「値が多い」だから出現回数順

「多い順」のソート対象は書いてないが
普通に考えれば入力した全数

これがおれの解釈
2018/07/30(月) 19:43:33.82ID:WDgnZ3L+0
出現頻度の上位3位分を出せ?

typedef double VAL_T;
struct {
 VAL_T val;
 int count;
} data[100] = { 0 };

線形探索して カウントアップして data[] を count をキーにソートして
data[0].val, data[1].val, data[2].val, を出力する
2018/07/30(月) 19:44:19.20ID:v5YMtZ310
整数値ではなくて実数値で出現回数って些か問題に無理がないか?
544デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/30(月) 19:56:43.56ID:xHVHgAPAa
>>541
その解釈が恐らく正しいと思うが、元の文章は素直に読むとそうならんよなあ。
2018/07/30(月) 19:58:59.40ID:WDgnZ3L+0
値の大きい順に上位3位なら
VAL_T data[100];

入力値をつっこんで data をソートして data[0], data[1], data[2], を出力する
int sortcmp(const void* c1, const void* c2)
{
 VAL_T d1 = *(const VAL_T*)c1;
 VAL_T d2 = *(const VAL_T*)c2;
 if (d1 > d2) return -1;
 else if (d1 < d2) return 1;
 return 0;
}

・・・・
qsort(data, num, sizeof(VAL_T), sortcmp);

for (i=0; i<3 && i<num; i++)
 printf("%d: %lg\n", i+1, (double)data[i]);
・・・・
2018/07/30(月) 20:08:25.88ID:aSIGzv/D0
>>544
そういう解釈も可能
2018/07/30(月) 20:10:45.97ID:aSIGzv/D0
色々な解釈が可能な文

仕様書からコードにするときには
複数の解釈が無いか気にした方が良い
548デフォルトの名無しさん (ササクッテロラ Sp47-SJhd)
垢版 |
2018/07/30(月) 20:17:02.90ID:kECQyXHfp
すみません。値が大きい順です。お願いします。
2018/07/30(月) 20:21:05.16ID:Ei1MMj+i0
良い試験問題だなw
2018/07/30(月) 20:23:08.08ID:aSIGzv/D0
ずこーっ

上位3個でqsortとか使うのはアホ
551デフォルトの名無しさん (アウアウウー Sa43-53i4)
垢版 |
2018/07/30(月) 20:25:48.38ID:r0zEs9EBa
ああ。sortコマンドとheadコマンド使いたくてうずうずする。
2018/07/30(月) 20:30:04.49ID:r0zEs9EBa
上位三つなら全部チェックすりゃあ良いんじゃないか?
ループとif文3つか?
2018/07/30(月) 20:39:55.63ID:WDgnZ3L+0
なんやソート使えという制限はないのか
554デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/30(月) 22:01:25.27ID:WHL4n1uA0
ココではquickselectというアリゴリズムを使いなさい
というのが正解

やっぱりなこのスレは浅はかなクルクルパーしかいないわ
2018/07/30(月) 22:06:32.60ID:Ei1MMj+i0
>>554
上位3名に入れそうだね?
2018/07/30(月) 22:17:34.44ID:aSIGzv/D0
quickselectもアホ
上位3個なら原始的なアルゴリズムが一番速い
2018/07/30(月) 22:18:31.28ID:aSIGzv/D0
速くて簡単でリソースも使わない
2018/07/30(月) 22:19:07.01ID:Z5guDo9v0
課題みたいだし
・バブルソートを書けるか
・保持する要素は3つでいいことに気付けるか
をみる定型問題だろね
2018/07/31(火) 08:53:15.13ID:CiY/UjgCK
アルゴリズムもわかってない
まず、問題解決のための適切なアルゴリズムの選択ができない

クイックソートは明らかに適切ではない
ここではクイックセレクトが適切

確かにこのスレには
まともな教育を受けたのはいない

基本的になにも知らなすぎる
白痴に近い
2018/07/31(火) 09:25:34.54ID:quzd6t9e0
クイックセレクトってどんなアルゴリズムなん?
元はクイックソートだけどソートしないで選択するだけって感じ?
561デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/31(火) 09:39:58.84ID:+/oTEV5Ja
>>560
無駄な比較をしない感じ
2018/07/31(火) 11:52:18.67ID:Sty7sRvnH
>>560
パーティショニングして目的の順位を含む方だけ再帰
2018/07/31(火) 12:06:11.93ID:TL2AM5+0M
あー、そういうことか
2018/07/31(火) 12:43:01.65ID:xftY0DAGd
明らかに上位3個の抽出には向かない
2018/07/31(火) 12:45:03.91ID:xftY0DAGd
最大値を探すのにクイックセレクトを使うアホはいない
そういうこと
3個でも同じ
566デフォルトの名無しさん (ワッチョイ 6f02-FeqO)
垢版 |
2018/07/31(火) 13:12:03.24ID:kZi5wZ5a0
入力毎に判定。
3プールのmin以下なら無視。
maxより大きいなら順位シフト。
mid以下ならmin上書き。
それいがいはmidをminにしてmid上書き。
2018/07/31(火) 13:17:53.66ID:xftY0DAGd
そういう原始的なアルゴリズムが最良
2018/07/31(火) 13:21:36.88ID:xftY0DAGd
最悪パターンは小さい順に並んだ時だが
これでもせいぜい数倍になるだけ

クイックセレクトの最悪値は酷い

もちろん典型例でも原始的アルゴリズムの方が速い
元データも変更不要
メモリも3個分だけ
2018/07/31(火) 13:29:26.70ID:NZiCEZHW0
1,ソート対象...data[5, 3, 12 ,8 ,6]
2,メモリをソート対象の最大値個数分確保...a[12]
3,ループでa[5]=data[5], a[3]=data[3]...と全部入れる
4.詰めてオシマイ

史上最速ソートだと思わないか?ループ1回で終わるどw
 
2018/07/31(火) 13:45:59.26ID:j6W8yzMq0
>>569
バケットソートだね〜
値の重複がある場合はリストをつなぐ必要があるし
今回の問題は要素が実数値だから不適になっちゃうけど
2018/07/31(火) 13:49:32.57ID:hTiFVqvS0
質問内容によるとソート対象は実数値なんだが
2018/07/31(火) 13:49:52.96ID:NZiCEZHW0
>>570
あ、そういう名前で実際あるんだね・・・
素晴らしいアイディアだと思ったのに(´・ω・`)
573デフォルトの名無しさん (ワッチョイ 6fe5-FeqO)
垢版 |
2018/07/31(火) 14:44:47.46ID:riS9l2jZ0
値をいれる必要はない。
各要素を出現回数のカウンタにすれば重複数も記録できる。

だがこれができるのは入力が整数で表せる場合だけ。
574デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/31(火) 14:46:44.33ID:UZkSYp0La
ま、しかし、普通の数値で100しかデータがないと今時のPCだとどんなアルゴリズム使っても人間が感じられないぐらいのスピードで実行しちゃうと思う。
わざとsleepとかするなら別だが。
2018/07/31(火) 14:57:40.88ID:PCFGvven0
今は熱対策が必要だな
2018/07/31(火) 17:49:39.11ID:xftY0DAGd
>>574
桁数が異常に長い入力とか
チープなマイコンとか
まあ色々と考えられる
577デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/31(火) 17:55:01.37ID:UZkSYp0La
あー。1万桁のデータが100個とか。w
2018/07/31(火) 17:58:48.84ID:zWbJ6Mhya
スレッドの引数に渡す構造体を↓みたいにして、
クラスのメンバ関数ポインタを渡そうとしたんですがエラーになります。

info.pfunc = test.callの部分はどう書くのが正解ですか?

typedef struct
{
void (*pfunc)();
} TInfo;

class TestClass
{
public:
void Call(void)
{
cout << "呼んだ" << endl;
}
};

main()
{
TestClass test;
TInfo info;

info.pfunc = test.call;
}
2018/07/31(火) 18:03:58.43ID:Yh1Yhi2x0
最近はC言語にクラスがあるの?
2018/07/31(火) 19:15:37.92ID:NZiCEZHW0
static void Call()
581デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/31(火) 20:20:43.19ID:4WdKzGL90
#include <stdio.h>
typedef struct tag_baka_t t_baka_t;
typedef int (*baka_func_t)(t_baka_t const* pt_baka);

typedef struct tag_baka_t {
char* text;
baka_func_t function;
} t_baka_t;

int call_baka1(t_baka_t const* ct_baka) { fprintf(stdout, "baka1:%s\n", ct_baka->text); return 1; }
int call_baka2(t_baka_t const* ct_baka) { fprintf(stdout, "baka2:%s\n", ct_baka->text); return 2; }
int call_baka3(t_baka_t const* ct_baka) { fprintf(stdout, "baka3:%s\n", ct_baka->text); return 3; }

int call(t_baka_t const* ct_baka) {
return ct_baka->function(ct_baka);
}

int main(int argc, char* argv[]) {

t_baka_t baka1 = { "boo", call_baka1 };
t_baka_t baka2 = { "foo", call_baka2 };
t_baka_t baka3 = { "woo", call_baka3 };

fprintf(stdout, "called baka1 -> returned %d\n", call(&baka1));
fprintf(stdout, "called baka2 -> returned %d\n", call(&baka2));
fprintf(stdout, "called baka3 -> returned %d\n", call(&baka3));
return 0;
}

C言語の構造体ならコレでいける
コレならバカでも分かるハズ
C++の構造体でも同じように書ける
2018/07/31(火) 20:29:50.71ID:qpn2fVfCd
ばかばっか
2018/07/31(火) 20:29:50.72ID:V319xmHP0
>>578
節子それc言語やないで
2018/07/31(火) 20:33:19.91ID:j6W8yzMq0
>>578
完全にC++ですやん
https://ideone.com/GkgfzA
とりあえずstd::functionの使いどころかなとは思うけど
2018/07/31(火) 21:00:04.51ID:YzKZx0BTa
>>584
これっぽいですね、ありがとうございます

オブジェクトポインタと関数ポインタを別スレッドに渡して、
スレッドでその関数を定期的にコールすることをしたかったんです
586デフォルトの名無しさん (ワッチョイ 6f9f-53i4)
垢版 |
2018/07/31(火) 23:06:10.75ID:ljgZb1RQ0
次からはC++の質問はC++のスレへ。
2018/08/01(水) 16:42:35.83ID:9yb7YrdQ0
クイックソートのwikipediaに書いてあるc言語のソースに、
【value_type tmp, pivot = med3(a[i], a[i + (j - i) / 2], a[j]); /* (i+j)/2 ではオーバーフローしてしまう */】
と書いてあるのですが、「(i+j)/2ではオーバーフローしてしまう」のオーバーフローする場合がまったくわかりません。
教えていただけますか。
2018/08/01(水) 17:40:34.16ID:TGp/sEuFd
i, jがどんな値かによる。
i == 0x7fffffff && j == 0x7fffffff
で、i + jがどんな整数値になるか考えたまえ。
2018/08/01(水) 18:09:35.03ID:9yb7YrdQ0
ありがとうございます。理解出来ました。
下限上限への理解がまだまだでした…
2018/08/01(水) 18:20:26.56ID:edgaccID6
>>587
unsigned char i=128,j=128,k;
k=i+j;
2018/08/01(水) 19:46:12.42ID:xh0kKqMn0
>>578が578のやり方でtest.Callのアドレスを渡せないのはなんでなん?理由が知りたい。
2018/08/01(水) 20:21:01.54ID:jfFEYUCE0
>>591
まず瑣末だけど、 test.call じゃなくて &Test::Call でメンバ関数のポインタを取らなきゃいけないってのはあるけど それはいいとして

ざっくり言えば「メンバ関数の型はクラスの型を含んでて、普通の関数とは型違うから」ってとこかねー

# g++
エラー: cannot convert ‘void (TestClass::*)()’ to ‘void (*)()’ in assignment
info.pfunc = &TestClass::Call;

スレチなので 解答が不足ならば「C++相談室」か「スレ勃てるまでもないC/C++の質問はここで」辺りで願います 
詳しい人いるだろうし
2018/08/01(水) 20:28:43.32ID:xh0kKqMn0
>>592
そのざっくりな説明だけでもわかりやすい。なるほどありがとう。
2018/08/01(水) 20:34:52.96ID:xh0kKqMn0
ググったら安定のロベールさん出てきた。買った方がいいなこれ基礎力でえらい差が出てしまう気がしてきた
595デフォルトの名無しさん (アウアウウー Sa43-53i4)
垢版 |
2018/08/01(水) 20:52:58.87ID:WDXOLOCva
C++の話はC++スレでやれ。
2018/08/01(水) 21:33:20.86ID:jJEMbL0b0
なんだ結局ロベールのステマかよしょうもねえな
2018/08/01(水) 22:23:36.11ID:ArWxfDp8a
>>592
分かりやすい説明
598デフォルトの名無しさん (ワッチョイ cf80-gYkF)
垢版 |
2018/08/02(木) 00:25:44.59ID:6TeXhDWV0
オーバフロー以前に
ポインタ同士の足し算なんかしないからな(Cでは普通のやりかたではできない仕様になってる)
ポインタ同士の足し算なんかしたらおもいっきりオーバーフローすることがあるからな
つまり簡単にオーバーフローはおきうる
ポインタにはアドレスが入ってるからな

やってることは
基準になるオフセット(ここでは左端)に距離を足すだけといっていい
距離は通常ポインタの引き算で求める

距離は左端と右端の距離の半分の距離に
基準になるオフセットに足す
すると中間点になる

つまり中間点固定

しかしピボットが中間点固定だと最悪のケースの場合
クイックソートはものすごく遅くなる

で、ピボットを乱数で選択することで
その最悪のケースを回避するというやりかたもある

実際の現実のデータでそんな最悪のケースはほぼないといっていい
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況