クイックソート
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/04/24 03:50 UTC 版)
ナビゲーションに移動 検索に移動 クイックソートのアニメーション | |||||||
クラス | ソート | ||||||
---|---|---|---|---|---|---|---|
最悪計算時間 | 確定した部分は太文字で表す。ピボットには下線を引く。 初期データ: 8 4 3 7 6 5 2 1
最悪計算量の回避時間計算量クイックソートの効率は配列の分割の効率に左右される。再帰の各段階で常に均等に分割される場合が最良であり、時間計算量は となる。一方で、常に「1要素と残り全部」のように偏って分割された場合が最悪のケースで、時間計算量が に悪化する。 最悪ケースを避けるにはピボットの選択に注意を払う必要がある。たとえば、既にソートされた配列に対して先頭や末尾の要素をピボットとすると最悪ケースとなる[注釈 1]。なるべく配列の中央値をピボットとして選べるようにすれば、このようなケースを回避できる。 代表的なピボット選択の戦略として、以下のようなものが挙げられる:
また、ピボットを選ぶ前に配列をランダムに並べ替えるなどの手法によっても、ソートに最悪計算時間を要する可能性を抑えられる[5]。 ただし、いずれの場合も最悪ケースの可能性を完全に排除できるものではない。これに対する根本的な改良として、一定の閾値よりも再帰が深くなったらヒープソートのような 時間が保証されるアルゴリズムに切り替える方法がある(イントロソート)。 空間計算量分割の操作自体は追加の領域を必要としないが、再帰によるコールスタックの消費が空間計算量となる。スタックの消費は平均的には となるが、最悪ケースでは に増大するため、大きなサイズの配列の場合スタックオーバーフローを起こす危険性がある。 対策として、「分割された配列のうち、要素数が少ない方を常に先に処理する」ことで、空間計算量を最悪 に抑えられる[1][4]。このようにすると、常に均等に分割される(最良時間の)場合に スタックとなる一方で、1要素ずつしか分割されない(最悪時間の)場合には定数スタックで済む[6]。 これを実装するには、明示的なスタックを用いて非再帰(ループ)構造とする[注釈 2]か、(末尾再帰の最適化機能があれば)要素数が多い方を末尾再帰で処理すればよい[4]。 また、イントロソートによっても最悪 空間を保証できる(再帰深さの閾値が となるように設定すればよい)。 実装例C言語C言語による実装例を以下に示す: /**
* 値を交換する
* @param x - 交換するデータのポインタ
* @param y - 交換するデータのポインタ
* @param sz - データサイズ
*/
void
swap(
void* x,
void* y,
size_t sz
) {
char* a = x;
char* b = y;
while (sz > 0) {
char t = *a;
*a++ = *b;
*b++ = t;
sz--;
}
}
/** 分割関数
*
* 配列をピボットによって分割し、分割位置を返す。
* @param a - 分割する配列
* @param cmp - 比較関数へのポインタ
* @param sz - データサイズ
* @param n - 要素数
* @returns 分割位置を示すポインタ
*/
void*
partition(
void* a,
int (*cmp)(void const*, void const*),
size_t sz,
size_t n
) {
// void* に対して直接ポインタ演算はできないので予め char* へ変換する
char* const base = a;
if (n <= 1) return base + sz;
char* lo = base;
char* hi = &base[sz * (n - 1)];
char* m = lo + sz * ((hi - lo) / sz / 2);
// m が median-of-3 を指すようソート
if (cmp(lo, m) > 0) {
swap(lo, m, sz);
}
if (cmp(m, hi) > 0) {
swap(m, hi, sz);
if (cmp(lo, m) > 0) {
swap(lo, m, sz);
}
}
while (1) {
while (cmp(lo, m) < 0) lo += sz; // ピボット以上の要素を下から探す
while (cmp(m, hi) < 0) hi -= sz; // ピボット以下の要素を上から探す
if (lo >= hi) return hi + sz;
swap(lo, hi, sz);
// ピボットがスワップされた場合、スワップ先を指すよう m を更新する
if (lo == m) {
m = hi;
} else if (hi == m) {
m = lo;
}
lo += sz;
hi -= sz;
}
}
/** クイックソート
*
* @param a - ソートする配列
* @param cmp - 比較関数へのポインタ
* @param sz - データサイズ
* @param n - 要素数
*/
void
quicksort(
void* a,
int (*cmp)(void const*, void const*),
size_t sz,
size_t n
) {
if (n <= 1) return;
char* p = partition(a, cmp, sz, n);
char* const base = a;
size_t n_lo = (p - base) / sz;
size_t n_hi = (&base[sz * n] - p) / sz;
quicksort(a, cmp, sz, n_lo); // 左側をソート
quicksort(p, cmp, sz, n_hi); // 右側をソート
}
cmp(x, y) は x < y なら負、x = y ならゼロ、x > y なら正の整数を返す関数とする。 SchemeSchemeによるクイックソートの実装例を示す: (require-extension srfi-1) ; SRFI 1 の呼び出し方は実装依存(場合によってはデフォルト)。これは Chicken Scheme の例。
(define (qsort f ls)
(if (null? ls)
'()
(let ((x (car ls)) (xs (cdr ls)))
(let ((before
(qsort f (filter (lambda (y) ; filter は SRFI 1 の手続き
;; compose は Chicken、Gauche、Guile、Racket 等に備わってる「合成関数を作る」手続き。
;; 詳細は Paul Graham の On Lisp
;; http://www.asahi-net.or.jp/~kc7k-nd/onlispjhtml/returningFunctions.html
;; を参照。
((compose not f) x y)) xs)))
(after
(qsort f (filter (lambda (y) ; filter は SRFI 1 の手続き
(f x y)) xs))))
(append before (cons x after))))))
PythonPythonによるクイックソートの実装例を示す: from typing import Any
from collections.abc import MutableSequence, Callable
# median-of-three
# 与えられた3値の中央値を返す
def median3(x, y, z):
return max(min(x, y), min(max(x, y), z))
# 分割関数
# 配列の指定範囲をピボットに従って分割する
#
# @param seq - 分割する配列
# @param keyFn - 配列要素のキー値を計算する関数
# @param first - 分割範囲の最初のインデックス
# @param last - 分割範囲の最後のインデックス
# @returns 分割点のインデックス
def partition(seq: MutableSequence[Any], keyFn: Callable[[Any], Any], first: int, last: int):
pivot = median3(keyFn(seq[first]), keyFn(seq[first + (last - first) // 2]), keyFn(seq[last]))
while True:
while keyFn(seq[first]) < pivot:
first += 1
while pivot < keyFn(seq[last]):
last -= 1
if first >= last:
return last + 1
seq[first], seq[last] = seq[last], seq[first]
first += 1
last -= 1
# クイックソート
#
# @param seq - ソートする配列
# @param keyFn - 配列要素のキー値を計算する関数
def quicksort(seq: MutableSequence[Any], keyFn: Callable[[Any], Any]):
def quicksortImpl(seq: MutableSequence, keyFn: Callable[[Any], int], first: int, last: int):
while first < last:
p = partition(seq, keyFn, first, last)
if (p - first) < (last - p):
quicksortImpl(seq, keyFn, first, p - 1)
first = p
else:
quicksortImpl(seq, keyFn, p, last)
last = p - 1
quicksortImpl(seq, keyFn, 0, len(seq) - 1)
脚注出典
注釈
関連項目参考文献
外部リンク
クイックソート出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/06/07 20:45 UTC 版) クイックソートのコード例を示す。MLは多くの関数型言語と同様、再帰処理に秀でる。また、Haskell などにも見られるパターンマッチの機能がここでも使われている。 let rec quicksort = function | [] -> [] | pivot :: rest -> let is_less x = x < pivot in let left, right = List.partition is_less rest in quicksort left @ [pivot] @ quicksort right ※この「クイックソート」の解説は、「OCaml」の解説の一部です。 ウィキペディア小見出し辞書の「クイックソート」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ。 クイックソートと同じ種類の言葉
辞書ショートカット 産業・環境キーワードISO用語辞典FA用語辞典ロジスティクス用語集印刷関係用語集古本用語集広告用語辞典視聴率関連用語コールセンター用語集ビデオ用語集タクシー業界用語辞典酪農用語解説農業関連用語林業関連用語水産大百科農林水産関係用語集農機具の種類環境用語集環境アセスメント用語水処理関連用語集気象庁 予報用語海洋基本計画用語集警察用語英訳一覧和英防衛略語集和英マシニング用語集英和ITS関連用語集作業環境測定和英辞典ラムサール条約用語和英対訳集 ','携帯電話(docomo)携帯電話(SoftBank)携帯電話(au)携帯電話(イー・モバイル)携帯電話(WILLCOM)デジタルカメラ(CASIO)NECパソコン博物館富士通歴代製品バーコード用語事典Prolog用語辞典電波の種類電波利用システムの種類光・電子デバイス用語集ネットワーク用語集プラグ・端子の種類サラウンド用語辞典デジタルレコーディング用語集AV機器関連用語辞典画像技術用語集情報セキュリティ用語集OSS用語集.NET Framework用語集PHP用語集IT用語辞典バイナリ拡張子辞典Excel関数リファレンスHTML4.01 リファレンスPHP関数リファレンス.NET Framework クラス ライブラリ リファレンス電気・電子用語集マイクロソフト用語集コンピューター用語辞典 ','西武鉄道京浜急行京王電鉄小田急相模鉄道阪神電車南海電鉄西日本鉄道とうてつ関東鉄道会津鉄道秋田内陸縦貫鉄道真岡鐵道新京成電鉄ゆりかもめ箱根登山鉄道いずはこね江ノ電湘南モノレール遠州鉄道岳南鉄道伊豆急行天竜浜名湖鉄道しなの鉄道愛知環状鉄道伊勢鉄道近江鉄道京都市交通局叡山電鉄北近畿タンゴ鉄道泉北高速鉄道大阪市交通局神戸市交通局神戸新交通一畑電車井原鉄道ことでん土佐くろしお福岡市交通局島原鉄道 ','自動車(スズキ)自動車(ダイハツ)自動車(トヨタ)自動車(日野自動車)自動車(ホンダ)自動車(マツダ)自動車(光岡自動車)自動車(三菱自動車)自動車(レクサス)自動車(イエス!)自動車(クライスラー)自動車(ジープ)自動車(ジャガー)自動車(ダッジ)自動車(ドンカーブート)自動車(BMW)自動車(ヒュンダイ)自動車(フォード)自動車(フォルクスワーゲン)自動車(ボルボ)自動車(ランドローバー)自動車(ランボルギーニ)自動車(ルノー)バスの種類霊柩自動車の種類バイク(カワサキ)バイク(スズキ)バイク(ホンダ)バイク(ヤマハ)バイク(アプリリア)バイク(MVアグスタ)バイク(カジバ)バイク(キムコ)バイク(KTM)バイク(ドゥカティ)バイク(トライアンフ)バイク(ハーレー)バイク(ハスクバーナ)バイク(BMW)バイク(ビューエル)バイク(ヒョースン) ','商船の種類日本の外航客船フェリー(新日本海フェリー)フェリー(阪九フェリー)フェリー(商船三井フェリー)フェリー(名門大洋フェリー)フェリー(宮崎カーフェリー)フェリー(東日本フェリー)フェリー(シルバーフェリー)フェリー(青函フェリー)フェリー(東京湾フェリー)フェリー(佐渡汽船)フェリー(駿河湾フェリー)フェリー(伊勢湾フェリー)フェリー(南海フェリー)フェリー(たこフェリー)フェリー(オレンジフェリー)フェリー(四国フェリー)フェリー(隠岐汽船)フェリー(有村産業)船舶(箱根観光船)船舶(清水港内クルーズ)船舶(名鉄海上観光船)船舶(一本松海運)船舶(常石造船カンパニー)商船三井120年の船 ','陸上自衛隊装備品海上自衛隊装備品航空自衛隊装備品消防装備飛行機図鑑飛行機(日本エアコミューター)航空軍事用語辞典++民鉄用語辞典大車林日本の自動車技術240選バイク用語辞典走査電子顕微鏡用語透過電子顕微鏡基本用語集製品安全・EMC用語集カム用語集ITS関連用語集石油/天然ガス用語集掘削用語集原子力放射線用語原子力防災基礎用語集原子力政策用語集実用空調関連用語氷蓄熱システム用語集地熱発電用語集マグネット用語集鉄鋼用語スラグ用語集研磨用語集機械加工技術用語集メンテナンス用語集プラスチック処理用語材料用語ねじ用語集ガラス用語集照明大辞典接着用語集時計用語集道路標識一覧鍛金の道具一覧歯車の種類科学技術論文動詞集機械工学英和和英辞典和英宇宙実験対訳用語集電気制御英語辞典 ','地盤関連用語集EPS建材関連用語集測量用語辞典舗装技術の種類舗装関係機械の種類土地区画整理事業用語集土木用語辞典道路用語辞典砕石用語辞典産廃リサイクル用語辞典セメントコンクリート用語河川用語解説集ダム事典不動産関連用語リフォーム用語集ログハウス用語集造園工具事典造園カタカナ用語辞典国産材一覧外材一覧 ','産学連携キーワード辞典宇宙用語辞典スペース百科算数・数学用語集統計学用語辞典人口統計学辞書OR事典日本化学物質辞書Web動く香りの分子事典動く高分子事典動く農薬事典動く薬物事典分子構造リファレンス超電導用語解説集電気化学用語集核融合用語集鉱物図鑑生物学用語辞典時間生物学用語集分子生物学用語集バイテク用語集海の事典南極辞典海氷分類の用語集水質用語集中国の都市一覧地図記号一覧大津の歴史事典防府歴史用語辞典日露戦争関連用語集近世年代歴史民俗用語辞典留学用語集世界宗教用語大事典法令名翻訳データ法令用語日英標準対訳辞書部局課名・官職名英訳辞典英和独禁法用語辞典学術用語英和対訳集JST科学技術用語日英対訳辞書英語論文検索辞書日英対訳言語学用語集英語論文投稿用語集和英図学用語辞書英和GIS用語集英和防災用語集ITER(国際熱核融合実験炉)用語対訳辞書脱原発和英小辞典和英教育用語辞典 ','世界遺産文化財選集正倉院宝物神社データベース世界の文字美術用語辞典美術用語集日本の勲章・褒章一覧記念貨幣一覧世界の流通コイン刀装具の世界刀剣用語解説集神道用語神社用語集鳥居の種類盆踊り用語辞典琉球舞踊用語集能面図鑑能楽用語集扇子・うちわの種類人形辞典帯締めの種類伝統的工芸品伝統的工芸品用語集全国和紙産地マップ国立公園一覧国定公園一覧日本の火山日本の川快水浴場百選日本の名水百選平成の名水百選日本の棚田百選水源の森百選全国疏水名鑑歴史的砂防施設日本の歴史的灯台日本の音風景100選かおり風景100選和の香り邦楽古典作品一覧国指定文化財等データベース全国火葬場データベース神社名辞典寺院名辞典島嶼名辞典河川・湖沼名辞典 ','キッチン用語集三州瓦豆辞典畳用語辞典薪ストーブ用語辞典ネイル用語辞典結婚用語集葬式用語ご贈答マナー献辞辞典ラッピング事典風呂敷の包み方印章事典アパレル用語集帽子カタログジーンズ用語辞典古着用語辞典皮革の種類下着用語辞典織りじゅうたん用語辞典 ','骨の一般用語連結・関節系の一般用語血液用語辞典目の事典レーシック用語集睡眠用語辞典健康関連用語辞典健康用語辞典健康用語の基礎知識女性のからだ用語解説美容整形用語集スパ用語集妊娠・子育て用語辞典エイズ関連用語集PDQ®がん用語辞書乳がん用語集筋疾患百科事典臓器移植関連用語集小児外科の病気国際保健用語集感染症の種類ぜん息の用語集アレルギー用語集生活習慣病用語辞典食品の安全性に関する用語集大腸肛門科辞典オストミー用語集経穴辞典介護用語集歯科用語実験動物症状観察用語集催奇形性所見用語集PDQ®がん用語辞書 英語版プライマリ・ケア英和辞典英和医学用語集英和解剖学用語集英和病理所見用語集眼科専門用語辞書英和環境感染学用語集英和歯内療法用語集英和寄生虫学用語集集団災害医学用語英和実験動物学用語集ライフサイエンス辞書 ','写真用語将棋用語集囲碁基本用語集競馬用語辞典競艇大辞典音楽用語辞典アコースティックギター用語集ホームシアター用語集ピティナ・ピアノ曲事典盆栽用語集園芸用語辞典陶芸用語大辞典縫い物関連用語集編み物関連用語集トールペイント関連用語集ビーズ用語集パチンコ用語辞典麻雀用語集ポーカー用語山岳用語辞典ナイフ用語集ナイフの分類と種類キャラクター(サンエックス)現代俳句(俳句)短編小説作品名辞典 ','スポーツ辞典ゴルフ用語集パラグライダー用語辞典自転車用語集スノーボード用語辞典カヌー用語辞典サーフィン用語集ダイビング用語集剣道用語辞典アーチェリー用語辞典Juggling用語事典球団データベースJリーグ クラブ一覧パラリンピック正式競技 ','薬用植物一覧デジタルお魚図鑑熱帯魚図鑑エンゼルフィッシュ図鑑ヤドカリ図鑑ウミウシ写真事典クワガタ・カブト図鑑カミキリ図鑑日本竹筒ハチ図鑑ウンカ・ヨコバイ図鑑アブラムシ図鑑ヒラタドロムシ幼虫図鑑ウミガメ用語集ぶたの品種羊の種類野鳥映像事典恐竜図鑑桜図鑑竹図鑑アイビー図鑑植物図鑑海藻海草標本図鑑らん用語集微生物の用語解説糸状菌類図鑑衛生昆虫写真館害虫の種類貯穀害虫・天敵図鑑森林生物図鑑動物名辞典植物名辞典品種登録データベース ','コーヒー用語辞典お酒・飲料大辞典日本酒用語集焼酎・泡盛用語集カクテル用語カクテルレシピラーメン用語辞典全国の生めん豆腐の種類かまぼこ製品図鑑チョコレート・ココア辞典チーズ一覧お菓子の辞典豚肉の部位バナナ用語辞典世界の油山菜図鑑お米の種類豆の種類食品成分データベース ','歴代総理一覧歴代アメリカ大統領一覧近代日本人の肖像日本銀行歴代総裁一覧コンピュータ偉人伝日本の創業者列伝IT企業家列伝電気史偉人典美術人名辞典地図測量人名事典三国志小事典戦国武将覚書江戸人物事典探偵作家事典芭蕉関係人名集現代俳句(人名)歴代天皇事典歴代天皇陵一覧日本棋院所属棋士一覧日本将棋連盟 棋士・女流棋士一覧日本陸上競技連盟選手名鑑ピティナ・ピアノ作曲家事典タレントデータベース ','北海道方言辞書下北弁辞典津軽語辞典仙台弁茨城弁大辞典あがつま語東京方言辞典新潟県田上町方言魚津弁甲州弁辞典名古屋弁辞典焼津の方言四日市市四郷地区方言京ことば但馬方言辞典大阪弁和歌山弁辞書鳥取弁辞書下関弁辞典高松の方言博多弁辞典奥豊後の言葉沖縄大百科 ','実用日本語表現辞典デジタル大辞泉日本語活用形辞書文語活用形辞書丁寧表現の辞書宮内庁用語難読語辞典原色大辞典標準案内用図記号外来語の言い換え提案物語要素事典アルファベット表記辞典外国人名読み方字典隠語大辞典季語・季題辞典歌舞伎・浄瑠璃外題辞典古典文学作品名辞典近代文学作品名辞典地名辞典駅名辞典住所・郵便番号検索名字辞典JMnedictウィキペディアウィキペディア小見出し辞書Wiktionary日本語版(日本語カテゴリ)漢字辞典Weblio日本語例文用例辞書Weblio実用類語辞典up!日本語WordNet(類語)Weblio類語・言い換え辞書WeblioシソーラスWeblio対義語・反対語辞書研究社 新英和中辞典研究社 新和英中辞典英語での言い方用例集Eゲイト英和辞典Weblio実用英語辞典up!コア・セオリー英語表現(基本動詞)ハイパー英語辞書JMdict英語ことわざ教訓辞典研究社 英和コンピューター用語辞典旅行・ビジネス英会話翻訳金融庁記者会見英語対訳外務省記者会見英語対訳Tatoeba日本語WordNet(英和)EDR日英対訳辞書日英・英日専門用語辞書日英固有名詞辞典JMnedict遺伝子名称シソーラスWeblio派生語辞書Weblio記号和英辞書Weblio和製英語辞書Weblio英語表現辞典英語イディオム表現辞典メール英語例文辞書Weblio英語言い回し辞典インターネットスラング英和辞典最強のスラング英会話場面別・シーン別英語表現辞典斎藤和英大辞典Weblio専門用語対訳辞書Weblio英和対訳辞書人口統計学英英辞書Wiktionary英語版ウィキペディア英語版Weblio例文辞書手話辞典歯科技工専門用語手話白水社 中国語辞典Weblio中国語翻訳辞書EDR日中対訳辞書日中中日専門用語辞典中英英中専門用語辞典Weblio中日対訳辞書Wiktionary日本語版(中国語カテゴリ)Wiktionary中国語版Tatoeba中国語例文辞書韓国語単語辞書韓日専門用語辞書インドネシア語辞書インドネシア語翻訳辞書タイ語辞書ベトナム語翻訳辞書Wiktionary日本語版(フランス語カテゴリ)Wikipediaフランス語版学研全訳古語辞典 '];function getDictCodeItems(a){return dictCodeList[a]};すべての辞書の索引 「クイックソート」の関連用語
検索ランキング | 11~20位 | 21~30位 |
Uber | |
ライブドア事件 | |
プラック | |
鹿内春雄 | |
頼近美津子 | |
あざとい | |
港浩一 | |
《貸与》の正しい読み方 | |
フジテレビのアナウンサー一覧 | |
西島まどか |
クイックソートのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。
All text is available under the terms of the GNU Free Documentation License. この記事は、ウィキペディアのクイックソート (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。 | |
Text is available under GNU Free Documentation License (GFDL). Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、WikipediaのOCaml (改訂履歴)、Guarded Horn Clauses (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 |
ビジネス|業界用語|コンピュータ|電車|自動車・バイク|船|工学|建築・不動産|学問
文化|生活|ヘルスケア|趣味|スポーツ|生物|食品|人名|方言|辞書・百科事典
ご利用にあたって | 便利な機能 | お問合せ・ご要望 | 会社概要 | ウェブリオのサービス |
©2025 GRAS Group, Inc.RSS