📜  算法|排序|问题1

📅  最后修改于: 2021-06-28 17:30:34             🧑  作者: Mango

最坏情况下QuickSort的重复发生是什么,最坏情况下的时间复杂度是多少?
(A)递归为T(n)= T(n-2)+ O(n)且时间复杂度为O(n ^ 2)
(B)递归为T(n)= T(n-1)+ O(n)且时间复杂度为O(n ^ 2)
(C)递归为T(n)= 2T(n / 2)+ O(n)且时间复杂度为O(nLogn)
(D)递归为T(n)= T(n / 10)+ T(9n / 10)+ O(n),时间复杂度为O(nLogn)答案: (B)
说明:当拾取的轴始终是已排序数组中的角元素之一时,会发生QuickSort的最坏情况。在最坏的情况下,QuickSort递归地调用一个大小为0的子问题和另一个大小为(n-1)的子问题。所以复发是

T(n)= T(n-1)+ T(0)+ O(n)

上面的表达式可以改写为

T(n)= T(n-1)+ O(n)

void exchange(int *a, int *b)
{
  int temp;
  temp = *a;
  *a   = *b;
  *b   = temp;
}
   
int partition(int arr[], int si, int ei)
{
  int x = arr[ei];
  int i = (si - 1);
  int j;
   
  for (j = si; j <= ei - 1; j++)
  {
    if(arr[j] <= x)
    {
      i++;
      exchange(&arr[i], &arr[j]);
    }
  }
   
  exchange (&arr[i + 1], &arr[ei]);
  return (i + 1);
}
   
/* Implementation of Quick Sort
arr[] --> Array to be sorted
si  --> Starting index
ei  --> Ending index
*/
void quickSort(int arr[], int si, int ei)
{
  int pi;    /* Partitioning index */
  if(si < ei)
  {
    pi = partition(arr, si, ei);
    quickSort(arr, si, pi - 1);
    quickSort(arr, pi + 1, ei);
  }
}

这个问题的测验