最坏情况下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);
}
}
这个问题的测验