データ構造:一般的な並べ替えアルゴリズム(6):クイック並べ替え(C ++実装)

データ構造:一般的な並べ替えアルゴリズム(6):クイック並べ替え

1.基本的な考え方:

参照要素(通常は最初の要素または最後の要素)をスキャンのラウンドで選択します。並べ替えるシーケンスは2つの部分に分割され、1つは参照要素よりも小さく、もう1つは参照要素以上であり、次に参照要素がその中で並べ替えられます。次に、同じ方法を使用して、各間隔に番号が1つだけになるまで、分割された部分を再帰的に並べ替えます。

2.例

例:配列a [15] = {3,44,38,5,47,15,36,26,2,46,4,19,50,48}は、クイックソートでソートされます

img

img

画像ソース:https://www.cnblogs.com/zwtgyh/p/10631760.html

コード例:

//辅助函数:交换值
void exchange(int * a, int* b) {
  int temp = *a;
  *a = *b;
  *b = temp;
}

//打印数组函数
void print_arr(int *a, int size) 
{
  cout << "打印数组:";
  for (int i = 0; i<size; i++)  //打印数组 
  {
    cout << a[i] << " ";
  }
  cout << endl << endl;
}
/*序列划分函数*/
int partition(int a[], int p, int r) {
  int key = a[r];//取最后一个
  int i = p - 1;
  for (int j = p; j < r; j++)
  { 
    if (a[j] <= key)
    {     
      i++;
      //i一直代表小于key元素的最后一个索引,当发现有比key小的a[j]时候,i+1 后交换     
      exchange(&a[i], &a[j]);
    }   
  } 
  exchange(&a[i + 1], &a[r]);//将key切换到中间来,左边是小于key的,右边是大于key的值。
  return i + 1;
}
  
void quickSort(int a[], int p, int r) {
  int position = 0;
  if (p<r)
  {
    position = partition(a,p,r);//返回划分元素的最终位置
    quickSort(a,p,position-1);//划分左边递归
    quickSort(a, position + 1,r);//划分右边递归
  } 
}
  //主函数
void main() {
  int a[15]={3,44,38,5,47,15,36,26,2,46,4,19,50,48};
  cout << "输入数组 a[15]={3,44,38,5,47,15,36,26,2,46,4,19,50,48} " << endl; 
  quickSort(a, 0, 14);
  print_arr(a, 15);
  
}

3.要約:

  • 最良の場合:分割の各ラウンドは、ソートされるシーケンスを2つの部分に分割するため、各部分に必要な時間は前のラウンドの1/2です。n個の要素のシーケンスがソートされている場合、再帰ツリーの深さは[logn] +1です。これは、logn再帰のみが必要であり、必要な合計時間はT(n)であり、最初にシーケンス全体をスキャンしてn回の比較を行ってから、シーケンスは2つに分割され、2つの部分にはそれぞれT(n / 2)時間が必要であり、次の順序で分割されます。T(n)= 2 T(n / 2)+ n T(n)= 2(2 *(T (n / 4)+ n / 2)+ n = 4 T(n / 4)+ 2nなど、T(1)= 0なので、T(n)= n T(1)+ n * logn = O (nlogn)
  • 最悪の場合:ソートされるシーケンスが順序付けられたシーケンス(正または逆)の場合、各分割後に得られる状況は、一方の側に1つの要素があり、もう一方の側に残りの要素があり、最後にn-1ラウンドのループがあることです。 、およびi番目のサイクルにはni回の比較が必要です。比較の総数はn-1 + n-2 +…+ 1 = n(n-1)/ 2です。つまり、時間の複雑さはO(n ^ 2)です。
  • クイックソートはその場でのソートであり、追加のメモリスペースを必要としません。
  • クイックソートは安定したソートではなく、交換プロセス中の安定性を破壊します。

おすすめ

転載: blog.csdn.net/qq_43801020/article/details/108137304