容易にクイックソート(クイックソート)を達成-java ---プログラミング

背景

クイックソートアメリカのアントニー・ホーアが提案により、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;
        リターンスタート。
    } 
}

 

おすすめ

転載: www.cnblogs.com/ziytong/p/12583782.html