コードファーマーからエンジニアまで、良い仕事を見つけるために、アルゴリズムシリーズの理解を記録しましょう。
クイックソートは交換ソートの一種であり、アルゴリズム設計の観点からの分割統治の考え方の現れです。ただし、元のバブルソートと比較して、いくつかの最適化が行われています。
すばやくソートするために、最初に理解することは、ピボットポイント(中点)があることです。この中点要素の左側にはすべて小さな要素があり、この中点要素の右側にはすべて大きな要素があります。これが核となる考えです。
それを達成する方法は?
最初に、最初の要素を「中間点」要素として使用します。
次に、左右に移動します。
もう一度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);
}
}