1、引用
- バブルソートには独自の欠点があります。これは、2つの隣接する要素間の交換であり、比較的非効率的です。明らかに、より多くのデータでソートするのには適していません。クイックソートは、バブルソートの改善です。1962年にCARHoareによって提案されました。
2.基本的な考え方
- クイックソートの基本的な考え方は、ソートによってソートされるデータを2つの独立した部分に分割し、一方の部分のすべてのデータが他方の部分のすべてのデータよりも小さいことです。次に、データの2つの部分を別々に実行します。この方法へクイックソートでは、ソートプロセス全体を再帰的に実行できるため、データ全体が順序付けられたシーケンスになります。
検討して、以下の配列:
9、3、6、5、7、4
最初の一歩:
- 最初にピボット、このピボットは自由に選択できます。アルゴリズムを設定できますピボット=配列[n / 2]、中央の数値
ピボット= 5を取ります。
2番目のステップ:
- ピボット左の大きな数よりも長い場合、右の数が
左のピボットよりも小さいことを見つけて、右から9を見つけます4
3番目のステップ:
- 有する第二のステップで見つかった二つの数字交換
4、3、6、5、7、9
4番目のステップ:
- 左右の添え字が等しくなり、現在の交換ラウンドが終了するまで、2番目のステップの条件を満たす次のデータを見つけます。
交換ラウンド後:
4、3、5、6、7、9
5番目のステップ:
- 4番目の手順が完了すると、左側の左側の添え字のデータはピボットよりも小さくなり、右側のデータはピボットよりも大きくなるため、順序付けられていない配列が2つの部分に分割されます。
– 4、3、5、こちら側のデータはすべて5より小さい(等しい);
– 6、7、9、こちら側のデータはすべて5より大きい。
6番目のステップ:
- 最初のステップから、分割された2つの部分までやり直して、再帰的に呼び出します。
3.C言語の実装
void quick_sort( int *array, int n)
{
int left, right, pivot, tmp;
if (n < 2) return; //递归退出的条件
pivot = array[n / 2]; //取中间的数为基准
for ( left = 0, right = n -1;; left++, right--)
{
//从左边开始找大于pivot的数
while (array[left] < pivot)
left++;
//从右边开始找小于pivot的数
while (pivot < array[right])
right--;
if ( left >= right) //本轮交换结束了
break;
//交换
tmp = array[left];
array[left] = array[right];
array[right] = tmp;
}
quick_sort(array, left); //对左边的排序
quick_sort(array + left, n - left);//对右边的排序
}
4.まとめ
- 分割統治
- 再帰
- 両替
5.リファレンス
https://www.youtube.com/watch?v=SLauY6PpjW4
http://developer.51cto.com/art/201403/430986.htmyc