[アルゴリズム]クイックソート

コードファーマーからエンジニアまで、良い仕事を見つけるために、アルゴリズムシリーズの理解を記録しましょう。

クイックソートは交換ソートの一種であり、アルゴリズム設計の観点からの分割統治の考え方の現れです。ただし、元のバブルソートと比較して、いくつかの最適化が行われています。
すばやくソートするために、最初に理解することは、ピボットポイント(中点)があることです。この中点要素の左側にはすべて小さな要素があり、この中点要素の右側にはすべて大きな要素があります。これが核となる考えです。

それを達成する方法は?
最初に、最初の要素を「中間点」要素として使用します。
次に、左右に移動します。
もう一度3つ考えてみてください。

ここをトラバースする場合、いくつかのコードのヒントがあることに注意してください。
イテレータiとjを取り、
i <jのとき、
最初に大きい要素を探し、右からトラバースし、小さな要素(「中点」より小さい)を見つけたら、停止してjとして位置を記録します。
次に、左からトラバースを開始します。ここで、<=を使用して、中点よりも小さい限り、大きな要素(「中点」より大きい)が見つかるまで前方に移動し続け、その位置iで停止することができます。
ここでは、iとjの対応する要素を交換します。
whileループを続ける

このようにして、ラウンドを完了することができ、ラウンドを完了することができます。つまり、中点の左側が小さく、右側が大きく、中点の位置はiとして知られています。
次に、2つの再帰関数を使用します。
quickSort(a、n、L、i-1);
quickSort(a、n、i + 1、R);
分割統治のアイデアを完成させることができます。
コードは次のとおりです。

// 快速排序,分治法
void quickSort(int a[],int n,int L,int R)
{
    if(L<R)
    {
        int i=L,j=R;
        int temp = a[L];
        while(i<j)
        {
            while(a[j]>temp&&i<j)
            {
                --j;
            }
            while(a[i]<=temp&&i<j)
            {
                ++i;
            }
            swap(a[i],a[j]);
        }
        swap(a[i],a[L]);
        quickSort(a,n,L,i-1);
        quickSort(a,n,i+1,R);
    }
}

おすすめ

転載: www.cnblogs.com/likeshu/p/12727419.html
おすすめ