背景
クイックソートアメリカのアントニー・ホーアが提案により、1960年代にソート方法です。この種は、非常に高速の一種ですでにでした。だから、名前で、それは「クイックソート」と呼ばれます。このアルゴリズムは、20世紀の7つのアルゴリズムのいずれか、Ο(nlogn)の平均的な場合の時間複雑であり、O(nlogn)の場合には、実際の演算速度が速く、時間複雑性の他の同じ種類よりも方法。
アントニー・ホーアと作られたのクイックソートの背景に興味のある学生のために、あなたは、この導入見ることができます:http://www.nowamagic.net/librarys/veda/detail/2391を
ソートのアイデア
クイックソートのアイデアは非常に困難であると思いますが、理解することは非常に簡単です
彼のアイデアは、この次のとおりです。
図1は、第一のベース(通常、選択されたヘッド素子または最後の要素)としてキュー、Value要素のいずれかを選択します。
2、順次全ての要素との大小比較基準値。二つの要素の比較結果に応じて、キューA、Bに分割され 値ベースのすべての要素よりも小さい値よりも大きいベースのすべての要素。
図3は、新しいキューAとして、ベースが再び選択され、そしてその後、2つの小さなキューに分け
図4は、この分割は、小さなに無制限の各小2つのキューをキューイングされています。
図5に示すように、キューが分割されるまで開くことがなくなるまで(すなわち、要素)
図6に示すように、キューの順序は固定されているからです。ランキング全体的に組み合わせたこれらのキューの最初は完了です。
(接続セキュリティ:本明細書http://www.cnblogs.com/jilodream/を開始してから)
2つのコアのステップがあることに注意してください、つまり、
図1に示すように、値要素には、選択された、全体のキューは、2つのサブキューに分割されています
図2は、再度新たなサブキューとして、全体のサイズは、計算は、これまで非常に簡単になるまで計算され、現在、新しいキューよりも小さくなっています。
高速行自然の利点を作成するための二つの重要なステップ:
1、キュー内の要素の下位区分の大きさを比較することで、次の比較プロセスは、この要素の比較範囲は常にもはや、このサブキューに滞在していない余分な比較を行います。これは、初期の比較はまだ比較的遅くに大きな影響を持っています。この方法は、その後の多くは比較的早く、後者の役割は非常に小さく、バブルソートに似ています。このポイントとKMPアルゴリズムの可能な最大活用限りのように、事前に比較。
2、元のキューの大きさ、いくつかの小規模なサブキューに分割、サブキューすべき:(最初http://www.cnblogs.com/jilodream/から登場この記事セキュリティコネクタ)オリジナルの問題を解決するために同じキューが、規模が小さくなっています。だから、常に分割統治の考えを形成するように分割します。このアイデアやバックパックのアルゴリズムも一致。
テキストは困難を理解するために、学生は非常に鮮やかな、このオンライン古典的な映画下記をご覧持って
Java実装:
輸入java.util.Arrays。 パブリック クラスクイックソート { 公共 静的 ボイドメイン(文字列引数[]) { クイックソートクイックソート = 新しいクイックソートを(); INT []アレイ= 新しい INT [] { 1、12、2、13、3、14、4、15、5、16、17、17、177、18、8、8、19 }。 quicksort.quickSort(アレイ)。 System.out.println(Arrays.toString(アレイ))。 } プライベート ボイドクイック(INT []配列) { subQuickSort(アレイ、0、arrays.length - 1 )。 } プライベート ボイド subQuickSort(INT []アレイ、int型開始、int型エンド) { 場合(> =開始終了) { リターン。 } INT middleIndex = subQuickSortCore(アレイ、開始、終了)。 subQuickSort(配列、開始、middleIndex - 1 )。 subQuickSort(アレイ、middleIndex + 1 、エンド)。 } プライベート INT subQuickSortCore(INT []アレイ、INT開始、INTエンド) { int型 middleValue = 配列[開始]。 一方、(開始< エンド) { 一方(配列[終了]> = middleValue &&開始< エンド) { エンド - 。 } 配列[開始] = 配列[END]。 一方、(配列[開始] <= middleValue && <開始端) { 起動 ++ 。 } アレイ[END] = 配列[開始]。 } 配列[開始] =middleValue; リターンスタート。 } }