並べ替え-クイックソート

1、引用

  • バブルソートには独自の欠点があります。これは、2つの隣接する要素間の交換であり、比較的非効率的です。明らかに、より多くのデータでソートするのには適していません。クイックソートは、バブルソートの改善です。1962年にCARHoareによって提案されました。

2.基本的な考え方

  • クイックソートの基本的な考え方は、ソートによってソートされるデータを2つの独立した部分に分割し、一方の部分のすべてのデータが他方の部分のすべてのデータよりも小さいことです。次に、データの2つの部分を別々に実行します。この方法へクイックソートでは、ソートプロセス全体を再帰的に実行できるため、データ全体が順序付けられたシーケンスになります。

検討して、以下の配列:
9、3、6、5、7、4

最初の一歩:

  • 最初にピボット、このピボットは自由に選択できます。アルゴリズムを設定できますピボット=配列[n / 2]、中央の数値
    ピボット= 5を取ります。

2番目のステップ:

  • ピボット左の大きな数よりも長い場合、右の数が
    のピボットよりも小さいことを見つけて、右から9を見つけます4

3番目のステップ:

  • 有する第二のステップで見つかった二つの数字交換
    43、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.まとめ

  1. 分割統治
  2. 再帰
  3. 両替

5.リファレンス

https://www.youtube.com/watch?v=SLauY6PpjW4
http://developer.51cto.com/art/201403/430986.htmyc

おすすめ

転載: blog.csdn.net/amwha/article/details/77440464