如何生成快速排序算法的最坏情况?

时间:2013-10-16 04:34:40

标签: java algorithm sorting quicksort

我如何生成并打印最快的情况设置为快速排序,考虑作为中间元素的枢轴?这是我对快速排序算法的实现:

  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;

 }

如何为此算法生成最坏的情况?

4 个答案:

答案 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)。

相关问题