3.クイックソート

  クイックソート(クイックソート)とバブルソートされているクラス分類を交換しましたクイックドレンは、バブルソートの改良です。ので、キーワードが比較交換するために実施されているジャンプ、非常に速く、それは一種である不安定性のランク付け方法。

 

0注文

1.バブルソート

2.クイックソート

2.1基本的な考え方

2.2クイックトリップ(分割トリップ)

2.3プロセス

2.4を実現します

2.5複雑さの分析

2.5.1時間計算(プルーフを含みます)

2.5.2スペースの複雑さ

 

       0注文

  もともとチューリング賞受賞者が開発した高速ソートアルゴリズムアントニー・ホーアは彼の正式な方法論では、設計されており、ALGOL60は、プログラミング言語の発明に優れた貢献をしている、それは世紀のコンピュータ科学者の最大の一つです。

  クイックソート、それは次のようにリストされている 20 トップ10アルゴリズム世紀の一つ。

 

  1.バブルソート

 

  、ソート処理中の記録シーケンス仮定 R [1 ... n]の状態のを:

 

 

 

  説明するために、より多くのバブルソートを参照してくださいhttps://www.cnblogs.com/datamining-bio/p/9715774.htmlを

  2.クイックソート

  クイックソート、それは常に並べ替えを達成するために比較すると、移動交換することですが、それは実現しています比較して、移動距離の記録を向上させる鍵がまっすぐに正面から移動し、より大きな記録、小さいキーワードであります記録それによって比較の総数とモバイルスイッチング時間を減少させる、直接後方から前方へ移動します

  2.1基本的な考え方

  行レコードによってソートする旅行は二つの独立した部分に分割される場合、レコードキーワードの他の部分よりもレコードのキー部分、小さい、および2つの部分を別々の配列決定は、順序付きのシーケンス全体まで続きます。

  2.2トリップクイックソート(時分割)

  目標:としてそのキーを使用して、レコードを検索するためのレコードは、キーがレコードに移動した後に記録されているハブよりも大きい場合は逆に、上、レコードに移動する前に、鍵はハブよりも小さい「ハブ」、。

 

 

 

 

 

 

 

  提供 R [S] = 52 ハブ

R [高] .KEY と比較キーワードハブは、必要R [高] .KEY キーワード≥ハブ

R [低] .KEY とパリティハブキーワード、必要とR [低] .KEY ≤キーワードハブを

 

  目に見える、後の「分裂」、キーシーケンス:

  52、49 80 36 14 58 61 97 23 75

  调整为: 23491436, (52),58,  6197,  8075

  在调整过程中,设立了两个指针:low 和 high,它们的初值分别为:s 和 

  之后逐渐减小high,增加low,并保证 R[high].key 52,和 R[low].key 52,否则进行记录的“交换”。

 

  2.3 过程

 

  首先对无序的记录序列进行“一次划分”,之后分别对分割所得两个子序列“递归”进行快速排序。

 

 

   2.4 实现

// 快速排序  O(nlogn) --->逆序O(n^2)
// 调用QSort(1, n)   待排记录index = 1 ... n
public int[] QSort(int low, int high){
    if(low < high){
        int p = Partition(low, high);
        QSort(low, p-1);
        QSort(p+1, high);
    }
    return needSort;
}
private int Partition(int low, int high){
    needSort[0] = needSort[low];
    while(low < high){
        while(low < high && needSort[high] >= needSort[0]) high--;
        needSort[low] = needSort[high];
        while(low < high && needSort[low] <= needSort[0]) low++;
        needSort[high] = needSort[low];
    }
    needSort[low] = needSort[0];
    return low;
}

 

  2.5  复杂度分析

  2.5.1 时间复杂度

  ① 在最优情况下,Partition每次都划分得很均匀,如果排序n个关键字,其递归树(见2.5.2)的深度就为,即仅需递归log2n次,需要时间为T(n)的话,第一次Partition应该是需要对整个数组扫描一遍,做n次比较。然后,获得的枢纽将数组一分为二,那么各自还需要T(n/2)的时间(注意是最好情况,所以平分两半)。于是不断地划分下去,我们就有了下面的不等式推断。 

T(n) 2T(n/2) + n, T(1) = 0

T(n) 2( 2T(n/4) + n/2 ) + n = 4T(n/4) + 2n

T(n) 4( 2T(n/8) + n/4 ) + 2n = 8T(n/8) + 3n

...

T(n) nT(1) + (log2n) * n = O(nlogn)

  

  不知道为什么是“≤”而不是“=”? 待补充

 

  也就是说,在最优的情况下,快速排序算法的时间复杂度为O(nlogn)。

 

 

 

  ② 在最坏情况下,待排序的序列为正序或逆序,每次划分只得到一个比上一次划分少一个记录的子序列,注意另一个为空。如果递归树画出来,它是一颗斜树。此时需要执行n-1次递归调用,且第i次划分需要经过n-i次关键字的比较才能找到第i个记录,也就是枢纽的位置,因此比较次数为,最终其时间复杂度为O(n2)

 

 

 

  ③ 平均的情况,设枢纽的关键字应该在第k的位置(1kn),每个位置的概率相同,均为1/n,那么:

 

 

 

  数学归纳法可证明,其数量级为O(nlogn)。 待补充

 

  通常,快速排序被认为是在所有同数量级O(nlogn) 的排序方法中,其平均性能是最好的。但是,若待排记录的初始状态为按关键字有序或基本有序时,快速排序将蜕化为冒泡排序,其时间复杂度为O(n2)

 

  このような状況を回避するために、分割を実行する前には、必要な"前処理"の最初の:すなわち、R&LT(S)キーは、R (T).KEY R&LT [ └(S + T)/2┘]を.KEY 、互いに比較して、「3の中で、」キーワードレコードのハブとしての記録を取ります。

 

 

  2.5.2 スペース効率

 

  例えば:

 

 

  クイックソート処理は再帰的に再帰的に図手順の上記の例に対応する所定の二進木の二値画像を生成することができます。

 

 

  クイックソートは、再帰的なポインタで、パラメータは、上記の層の再帰呼び出し深バイナリツリーと一致するストア使用に各再帰呼び出しスタックです。したがって、内のストレージオーバーヘッド理想的な場合は O(ログ2 N-)にも空間複雑である木の、すなわち、高さ、O(logN個)で、最悪の場合、必要とするN-1 再帰呼び出しを、すなわち、二分木一本鎖であり、O(N)の平均の場合の空間の複雑さもあり、O(logN個)

  キーワード比較交換が行わジャンプしているので、それゆえ、クイックソート不安定なソート方法であることに注意してください。

 

参考:

  クラスPPT

  「西のデータ構造」チェン傑清華大学プレス、2011.6(2017.6転載)

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/datamining-bio/p/11961664.html