我如何生成并打印最快的情况设置为快速排序,考虑作为中间元素的枢轴?这是我对快速排序算法的实现:
void quickSort(int arr[], int left, int right) {
int index = partition(arr, left, right);
if (left < index - 1)
quickSort(arr, left, index - 1);
if (index < right)
quickSort(arr, index, right);
}
int partition(int arr[], int left, int right){
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};
return i;
}
如何为此算法生成最坏的情况?
答案 0 :(得分:5)
将pivot元素设置为等于最低或最高数字,应该是最坏的情况。在这种情况下,复杂性是 O(n ^ 2)。
答案 1 :(得分:2)
当数组已经排序时,会发生最快的快速排序算法。枢轴应该尽可能平均地分割数组,其中枢轴左侧的元素小于枢轴,而右侧的元素更大,即枢轴在分类数组中的最终位置固定,不再进一步在枢轴上发生交换。这允许我们将数组左侧的数组和数组独立处理,并在其上递归应用相同的算法。
最糟糕的情况发生在我们的pivot元素尽可能不均匀地分割数组时,即在较小的一半中代替理想的n / 2元素,我们得到零 - 意味着数组中的最大或最小的枢轴。 / p>
因此,最糟糕的情况发生在输入数组已经排序的情况下 - 如果选择了枢轴作为第一个或最后一个元素。
当枢轴选择算法选择中间元素时,基本上最坏的情况发生在选择枢轴使得它留下一个分区为空时,即每次选择的枢轴是最小/最大。
答案 2 :(得分:1)
快速排序的最坏情况是每次分割数组都应该是单侧的。所以输入数组可以是一个排序数组。
答案 3 :(得分:0)
快速排序的最坏情况是当您选择枢轴为阵列中的最低或最高元素,然后尝试围绕它进行分区。如果您每次都选择数组中的最低或最高元素作为分区,那么您将接近n 2 比较/交换。为了避免这种最坏情况的行为,您可以使用线性时间(O(n))的median of medians算法为您选择合适的数据透视表,它将使您的最坏情况为O(n log n)。