出典:のhttp://blog.csdn.net/hkx1n/article/details/3922249
ソートアルゴリズム安定していないソート、クイックソート、シェルソート、ヒープの並べ替えを選択して、
バブルソート、挿入ソート、マージソートと基数ソート安定ソートアルゴリズムです。
時間の複雑さをセトリングnlognレベルはマージソートです。
バブル法は:
これはまた、同様のアルゴリズムの最も遅いが知られており、最も原始的です。彼の名前の由来は、バブルのような仕事に表示されますので:複雑さはO(N * N)です。データが正のときは、何のやり取りはありません。複雑さはO(0)です。
ソート直接挿入:O(N * N)
選択ソート:O(N * N)
クイックソート:平均時間計算量LOG2(N)* nは、すべての内部ソートの最高の良いアプローチを、ほとんどの場合、常に最高。
マージソート:LOG2(N)* n個
ヒープソート:LOG2(N)* n個
ヒル並び替え:1.2のn乗のためのアルゴリズムの複雑
ここで私は、これは非常に簡単ですので、私たちは直接のアルゴリズムを分析し、行動の分析を与えていません。
まず、我々は理想的な状況を検討し
、あなたが常に2によってサブ割り切れるを行くことができますので、1配列のサイズが2のべき乗です。Kは、二つ、すなわち、K = LOG2(N)の力であると仮定されます。
我々は正確に選択する2.すべての時間は、アレイは、等分することができますように、中央値です。
第一の層の再帰ループをn回、第二層ループ2 *(N / 2)......
したがって、合計N + 2(N / 2) +4(N / 4)+ ... + N * (N / N)= N + N + N + ... + N = K * N = LOG2(N)* N
ので、アルゴリズムの複雑さはO(LOG2(N)* Nである )
、この場合にのみ意志以外貧しい、最悪の事態は、最小または最大にそれぞれ選択され、その後、彼は交流(再帰を使用しているため、状況はさらに悪くなる)になります真ん中にあります。しかし、あなたはずっと起こって、この可能性を思いますか??ああ、あなたはこの問題を心配する必要はありません。練習は、ほとんどの場合、クイックソートは常に最善であることを証明しています。
あなたがこの問題を心配している場合は、安定したO(LOG2(N)* nはヒープソート、使用することができます ) アルゴリズムを、しかし、速度が通常より遅く(原因ヒープの再編に)クイックソートよりもです。
最近では、多くの場合、まだ、と私のための複数の選択肢は、私は、学生が簡単もちろん、対象を締結することができ疑わないよう、安定性の判断にソートアルゴリズム問題の共通の中に数回、連続運転を書かあなたが安定しているとデータ構造についての本を覚えて前に書かれている場合は、それを得るために簡単なはずですので、安定していません。
常に最後にそれを覚えているか、実際にそれが安定または不安定の人が準備している理由を理解したいため、この資料です。
まず、ご注文の前に私たちが知っておくべきソートアルゴリズムの安定性は、単にシーケンスの前後2箇所のソート順とシーケンスの前と後の2つが同じ位置にある同数のを確実にするためです。シンプルなフォーマルな表情で、愛= Ajと、愛の元の位置の場合の前、後、または前に愛のAJ位置をソートします。
第二に、彼は、安定性の利点について語りました。ソートアルゴリズムが安定している場合は、ソート・キーから、その後の他のキーは、ソートに使用することができる第2の鍵の最初のキー結果を注文、ソート。要素はまた、高下げるよう基数ソートので、低プレスは、高をソートすることにより、順次ソートされ、その後の順序は同じでは変更されません。ソートアルゴリズムが安定している場合に加えて、比較に基づいてランク付けアルゴリズムの観点から、スイッチング素子の数が少ない(確認されていない個人的な感情)であってもよいです。
トピックに戻る、今や共通ソートアルゴリズムの安定性を分析し、それぞれが単純な理由を与えられました。
(1)バブルソート
バブルソート少しの要素が大きな要素で前方または後方に移動されます。二つの隣接する要素の比較はまた、交換は、これら二つの要素の間で起こる、以上です。二つの要素が等しいのであれば、私はあなたがそれらの二つが外観を交換入れて退屈することはないだろうと思い、そうでない場合二つの等しい隣接する要素も隣接する最大2つのペアごとの交換によってフロントた場合、その切り替わらない場合は、そのことは、要素の前と後の同じ順序が変更されていないので、バブルソートアルゴリズムをソート安定しています。
(2)選択ソート
選択ソート、n-1個の要素まで、そのような第二の小さな選択の第2の要素にの残りの要素の最小第一の位置を選択し、そしてようにするように、各電流要素部位の最小値を選択することですn個の要素があるため、それだけの最大の要素のうちの1つの下で、選択しないでください。小さな要素が後ろに現れ、現在の要素に等しい要素の一つは、交換の安定性が破壊されている間、その後、選択された旅行、現在の要素は、一つの要素よりも小さい場合。一口は、例えば、配列58529は、我々は最初のパス選択する第1要素2と5が交換され、二つの対向する縦5の元の配列順序が壊れていることを知っているので、ソートが選択されていません安定ソートアルゴリズム。
(3)挿入ソート
挿入ソートは、第1のインサート要素上の小さなすでに順序付けられたシーケンスに基づいています。もちろん、この整然としたシーケンスの先頭には、わずかな要素は、最初の要素です。比較では、要素を挿入すると、あなたが挿入され、それを見つけるまで、直接その背後に挿入されたよりも大きな、または正面を向いて、他の場合は、最大より開始するように命令されている、あること、最初の終わりから順序付けられたシーケンスであります場所。出会うとインサート要素が等しい場合、戻し要素に挿入された要素のような挿入要素は等しいです。したがって、同じ要素前後の順序を変更しない、元のシーケンス障害の順序からは、挿入ソートが安定しているように、列の順序付けられたシーケンスの後にあります。
(4)がクイックソート
クイックソート二方向に、添字iがすぐに、残されているときに[I] <= [ center_index]、 添字center_indexがアレイの中心的な要素であり、アレイは通常0であると解釈されます要素。そして、右側のj個のインデックスが行くために残されている、とき[J]> [center_index ]。iおよびjが歩行している場合、I J <= J、[I]を交換し、A [j]は、上記のプロセスは、Iまで繰り返されます>。[J]と[center_index]、クイックソートの完全な旅行を切り替えます。中央要素が[j]は交換するときや、そのような配列53343891011、今中央要素3および5(第5要素と前の要素の安定性を混乱させる可能性があります、インデックスが始まるが、交換はクイックソートが不安定なソートアルゴリズムであるように、要素3の安定性を破壊する)カウント、不安定性が中心的な要素で発生し、交換時期の[J]。
(5)マージソート
マージソートを再帰的に短い配列の配列に分割することで、短いシーケンス再帰が唯一の出口要素(直接注文こと)または2配列(比較およびスワップ1)、次いで、各セグメントの秩序ありますオリジナルの合併の長い、連続したシーケンスの順序付けられたシーケンスに結合シーケンスすべてがソートされるまで。意図的に不安定にすることなく、切り替えられない場合には、スイッチング素子にはない、一つまたは二つの要素に、同じ大きさの要素2を求めることができます。だから、合併のプロセスの短い順序列では、安定性が破損するかどうかですか?いいえ、合併処理、我々は現在の二つの要素が等しい場合、我々は、このような安定性を確保し、シーケンスの結果の前に格納されている要素のシーケンスの前にあることを保証することができます。マージソートアルゴリズムだからソート安定しています。
(6)基数ソート
基数ソートローに応じた第一ソートし、次いで回収し、次いで収集次に高いに従ってソート、および;など、最も高い位置まで。時には、最初の低い優先順位を付けることで、いくつかの属性の優先順位があり、その後、高い優先度をランク付け、最終順位は、まず、以前の高い、高優先度の同じ高、低優先度の高い優先度です。それは安定したソートアルゴリズムであるので、基数ソート、収集、仕分け基づいています。
ソーティング(7)ヒル(シェル)
速い、シェルソート非常に無秩序要素を起動したとき、最大ステップ、要素の同期に応じ長い挿入ソートではないので、素子数が少ないのソートに挿入;場合の基本的な要素順序付け、ステップサイズは、高効率のために小さい、挿入ソート順序付きシーケンスです。したがって、ヒルソーティング時間複雑度は、O(N ^ 2)個より良いだろう。複数の挿入ソートので、挿入ソート、我々は、要素がそれぞれ挿入ソート、挿入ソート別のプロセスで動かすことができるように、その安定性は最終的になります、1が安定している、それは同じ要素の相対的な順序を変更しないことを知っているが、シェルソートが不安定であるので、それは、破壊されています。
(8)は、ヒープソート
我々はヒープ構造は、子ノードである知っている私は、私と2つの* I + 1つのノードは、大きなトップが親ノードが2つのつの子ノードに等しい以上であることを要求スタック*、少しトップスタックは親を必要と2である少ない2に等しい以上です子ノード。長さの配列のN、ヒープソートプロセス及び3の最初の子の最大値は、N / 2又は最小(マイナー頂点スタック)から(大スタックのトップ)は、これらの三つの要素の選択を選択されたノードもちろん、安定性を損なうません。しかし、N / 2-1、N / 2-2、 ... 1 親要素を選択された不安定になります。同一のスイッチング素子の節点の最初のN / 2-1親が同じで、これらの2つの要素間の安定性、後ろないが、スイッチング素子のスイッチングの親ノードの後ろにN / 2の可能は、渡されましたそれは破壊されています。だから、ヒープはソート安定ソートアルゴリズムではありません
1クイックソート(クイックソート)
クイック場所は分割ルール、大規模な再帰アルゴリズムの一種です。本質的には、それは場所のマージバージョンの一種です。クイックソートは、以下の4つのステップで構成することができます。
(1)複数のデータであれば直接戻ります。
(2)は、典型的には、支点として左端値データ列を選択します。
(3)二つの部分、支点よりデータ部大きなに配列、支点は、データの他の部分よりも小さいです。
ソートシーケンス再帰の両側(4)。
クイックソートより高速なソートアルゴリズムのほとんどより。我々はいくつかの特殊なケースではなく、通常の状況の面でより高速なクイックソートアルゴリズムよりも書くことができますが、何より速く、それは最高のものよりはありません。クイックソートは、マシンの非常に限られたメモリのために、それは良い選択ではない、再帰的です。
2マージソート(マージ)
一回のみの組に分解するとき4 2,2に分割1から分解にソートするマージソート順序は、順次分解し、パケットがソートされ、元のシーケンスにマージすることができシーケンス、すべてのデータをソートすることができるようにということ。それは余分な配列を必要とするため、ヒープソート、ソートわずかに速くソート・ヒープよりもマージが、必要以上の二倍多くのメモリ空間として。
3ヒープソート(ヒープソート)
データ・アプリケーション(データの何百万)の非常に大量のソート適しヒープ。
ヒープソートは、再帰的な配列や多次元ステージングの多くを必要としません。これは、データ系列の非常に膨大な量が適当です。例えば、数百万レコードの上に、クイックソートのように、再帰的なアルゴリズム設計を使用するマージソート、データの量が非常に大きく、スタックオーバーフローエラーが発生する可能性があります。
ヒープソートすべてのデータは、スタックの最上部にある最大のデータをスタックを構築し、その後、先頭のデータ・スタックと最後のデータ交換シーケンスます。その後、再び交換データをヒープを再構築し、下げて、あなたはすべてのデータをソートすることができます。
4シェルソート(シェルソート)
シェルソート、異なるグループにデータを分割する最初のソートは、すべての要素一度挿入ソート、データ交換の各グループ及び移動の数を減らすことによって。平均効率は、O(nlogn)です。パケットが重要な影響を与えることになる合理化アルゴリズム。今多目的グループ化法のDEKnuth。
シェルソート5倍速いバブルソートよりも、約2倍高速挿入ソートより。遅くクイックソート、マージソート、ヒープソートよりシェルソート。しかし、それは比較的簡単です、それは5000のデータ量に適しており、スピードが機会は特に重要ではありません。これは、順次繰り返しデータ列の量が少ないために非常に良いです。
5挿入ソート(InsertSort)
シーケンスの値によって挿入ソートは、シーケンスの終わりまで、ソートされた配列に挿入されています。挿入ソートバブルソート向上しています。これは、2倍高速バブルソートよりもあります。一般に、データは、ソート、挿入ソートを使用して、1000年よりも大きい、または200以上の反復データ項目の場合には使用されません。
6バブルソート(バブルソート)
バブルソート最も遅いソートアルゴリズムです。実際には、アルゴリズムの最低効率です。これは、大規模なデータは、データのわずかな増加をシンクするように、トリップし、アレイ内の各要素を比較することにより、トリップ。これはO(N ^ 2)のアルゴリズムです。
7 Aソーティング(ExchangeSort)選別および選択(SelectSort)
ソートアルゴリズムは、両方のスイッチング方法をソートされ、効率は、O(N 2)。そして、バブルソートの実用的なアプリケーションでは本質的に同じ位置にあります。彼らはただ、ソートアルゴリズムの開発の初期段階の、より少ない実際に使用されます。
8基数ソート(基数ソート)
基数ソートし、通常のソートアルゴリズムは、同じルートを取ることはありません。私たちは同じアプローチを取る場合は浮動小数点数に適用することは、比較的新しいアルゴリズムであるが、それは整数をソートするためにのみ使用することができ、我々は、保存形式の浮動小数点数を理解する必要があり、および浮動小数点は特別な方法をマッピング整数、その後、マッピングされた背中に、これはそれゆえ、その使用も過言ではない、非常に面倒なことです。そして、最も重要なのは、このアルゴリズムはまた、より多くのストレージスペースを必要とします。
9概要は
以下はおおよそ私たちの共通のソートアルゴリズムのすべての特徴をまとめ、トータルの表です。
整理 | 平均時間 | 最悪の場合 | 安定 | 追加のスペース | リマーク |
バブル | O(N 2) | O(N 2) | 安定しました | O(1) | nは時間よりよいです |
為替 | O(N 2) | O(N 2) | 不安定な | O(1) | nは時間よりよいです |
選択 | O(N 2) | O(N 2) | 不安定な | O(1) | nは時間よりよいです |
挿入 | O(N 2) | O(N 2) | 安定しました | O(1) | 注文した最も良いです |
カーディナル数 | O(ログR B)を | O(ログR B)を | 安定しました | O(n) | Bは、真数(0-9)であります Rは基数である(千) |
シェル | O(nlogn) | O(N S)1 <S <2 | 不安定な | O(1) | sがパケットを選択します |
速いです | O(nlogn) | O(N 2) | 不安定な | O(nlogn) | nは大きな、より良いです |
合併 | O(nlogn) | O(nlogn) | 安定しました | O(1) | nは大きな、より良いです |
ヒープ | O(nlogn) | O(nlogn) | 不安定な | O(1) | nは大きな、より良いです |