序文
クイックソートは、アントニー・ホーアのによって開発されたソートアルゴリズムです。平均的条件の下では、Ο(nlogn)にソートn個の項目に時間を比較。最悪の状況では、Ο(N 2)比較する必要がありますが、この状況は珍しいことではありません。実際には、クイックソートはかなり高い他Ο(nlogn)アルゴリズムよりも、通常はその内部ループ(内側のループ)が建築の最も上のうち、非常に効率的に実装することができますので、より高速です。
クイックソート二つのサブシリアル(サブリスト)に分かれているシリアル(リスト)を入れて分割統治(分割統治)戦略を使用。
クイックソートソートアルゴリズムの分割統治の考えを適用する典型的なものです。基本的に、クイックソートは、ソートに基づいて再帰的な分割統治をバブリングする必要があります。
名前を聞いたクイックソート名前のシンプルかつ、粗であるから、あなたは、高速で、かつ効率的であり、その存在の意味を知っているでしょう!それは最速のソートアルゴリズムを処理するビッグデータの一つです。最悪のケースの時間計算量はO(n²)に達したが、人々は、より良い平均時間計算量はO(nはLOGN)であるよりも、良いですが、ソートアルゴリズムは、ほとんどの場合、より良い善戦が、なぜこれがあります知りません。幸い、私の強迫性障害とは、コミットし、より多くのN個のデータよりも捜査は最終的に「アルゴリズムアートと情報コンテスト」に満足のいく答えを見つけました:
最悪の場合の動作クイックソートはO(n²)、例えば、高速行順序番号配列です。しかし、それは望ましい償却時間であり、O(nlogn)、およびO(nlogn)の表記は、安定したO(nlogn)マージソートより等しい複雑さが非常に小さい、小さい定数係数を意味しています。だから、弱い乱数列の順序の大半は、クイックソートはより良いマージソートよりも常にあります。
アルゴリズムステップ
図1に示すように、「参照」(ピボット)と呼ばれる、一連の一つの要素を選びます。
図2に示すように、列を並べ替え、基準値よりも基準小の前に置かれたすべての要素は、すべての要素が基準よりも大きい基準値の後ろに配置された(番号は同じ側のいずれであってもよいです)。パーティション終了後、中間位置の列の数に基づいて。これは、パーティション(パーティション)動作と呼ばれます。
図3に示すように、再帰的に(これを再帰的)基準値よりも列の数とサブ要素は、ソートされた列の子要素の基準値よりも大きいです。
再帰のボトムケースは、サイズが列の数は、常に十分にソートされている、すなわち、0または1です。それは再帰されていますが、このアルゴリズムは常にために行くために最終的な位置に少なくとも一つの要素に置かれる各イテレーション(反復)、で、終了しますが。
基本的な考え方 :(パーティション)
-
開始値の列数としてキー番号を削除します。
-
その左側の総数より小さな数は、それより大きいか、その右側の全ての数に等しいです。
-
左と右の2つの列が一つだけの数、各区間まで繰り返しステップ10進数。
理解の補助:数で塗りつぶしを掘り
当初、私= 0; J = 9;キー= 72
図1に示すように、番号が保存されているので、キー[0]は、データは、これに他に充填することができる、配列a [0]にピット掘り込みと理解することができます。
2、キー数よりも楽しみにしてスモールスタートからJ。リフィル[0]におけるピット掘っにA [8]; I ++、J = 8が、要件を満たしている場合に、[0]〜[8]を=。
3、こうしたピットA [0]まで取得することでしたが、新しいピットAの形成[8]、これをどのように行うには?シンプル、[8]ピットを埋めるために、デジタル見つけます。
4、iはキーより大きい数から後方に探し始めるが、iが3 =とき、[8] [3] =、要件を満たす; J-;リロードピット掘り込みへの[3]〜インチ
1、I = 3、J = 7;キー= 72
2、その後はスタートが楽しみにしてた後、上記の手順を繰り返し、その後、フロント振り返ります。
とき、ピットを掘っを埋めるための条件に沿って、J = 5、[5]、[3] = [5] 3は、始まるJから楽しみにして、私は++;
iは== jの出口から、5 =場合4、最初から私は、後方に探しています。
図5は、この時点で、私はJ = = 5、およびA [5]はちょうど最後のピットを掘っ、これキーフィルである[5]。
図から分かるように、[5]には、以下、上記の数字よりも、[5]は、それの後の数字よりも大きいです。従って上記の手順は、この二つのサブ間隔[0 ... 4]および[6 ... 9]について繰り返されます。
マップのプレゼンテーションを移動します
PHPコードの実装
function QuickSort($arr){
$num = count($arr);
$l = $r = 0;
$left = $right = array();
// 从索引的第二个开始遍历数组
for ($i = 1;$i < $num; $i++) {
// 如果值小于索引1
if ($arr[$i] < $arr[0]) {
// 装入左索引数组(小于索引1的数据)
$left[] = $arr[$i];
$l++;
} else {
// 否则装入右索引中(大于索引1的数据)
$right[] = $arr[$i];
$r++; //
}
}
// 如果左索引有值 则对左索引排序
if($l > 1) {
$left = QuickSort($left);
}
// 排序后的数组
$new_arr = $left;
// 将当前数组第一个放到最后
$new_arr[] = $arr[0];
// 如果又索引有值 则对右索引排序
if ($r > 1) {
$right = QuickSort($right);
}
// 根据右索引的长度再次增加数据
for($i = 0;$i < $r; $i++) {
$new_arr[] = $right[$i];
}
return $new_arr;
}