【问题标题】:Understanding quick sort algorithm and its worst case了解快速排序算法及其最坏情况
【发布时间】:2014-12-30 05:21:51
【问题描述】:

我想我知道快速排序算法。但我需要帮助找出最坏的情况。

让我们看看下面的快速排序代码---->

void quicksort(int arr[],int low,int high) //low and high are pased from main()
{
 int m;
 if(low<high)
 {
  m=partition(arr,low,high);
  quicksort(arr,low,m-1);
  quicksort(arr,m+1,high);
  }
}
int partition(int arr[],int low,int high)
{
 int pivot=arr[low],i=low,j=high;
 while(i<j)
 {
  while((arr[i]<=pivot)&&(i<=high))
  i++;
  while(arr[j]>pivot)
  j--;
  if(i<j)
  swap(arr,i,j);               //swaps arr[i]and arr[j]
 }
  swap(arr,low,j);             //swaps arr[low] and arr[j]
  return j;
}

这里不写swap函数的定义,因为它是不言自明的。

现在让我们跟踪 arr 1 2 3 4 5 的上述代码

0   4    0         partion swaps 1 with 1 and returns 0 which is assigned to m
low high m     
__________________________
0   0    *         
0   4    0
low high m
___________________________
0   0    * 
1   4    1         partition swaps 2 with 2
0   4    0
low high m
____________________________
2   4    2         partition swaps 3 with 3
1   4    1
0   4    0
low high m
____________________________
2   1    * 
2   4    2         
1   4    1
0   4    0
low high m
______________________________
3   4    3            partition swaps 4 with 4
2   4    2
1   4    1
0   4    0
low high m
________________________________
3   2    *
3   4    3
2   4    2
1   4    1
0   4    0
low high m
_________________________________
4   4    *
3   4    3
2   4    2
1   4    1
0   4    0
low high m
_________________________________
Stack empty
low high m

问题1.我对快速排序的理解正确吗?

ques2.在最坏的情况下,快速排序进行 n-1+n-2+.....+1 次比较。如何?

在这里,我认为它会有 n+2 比较...而不是 n-1。 分区会检查

(1<=1,i++),(5>1,j--),
(2<=1,don't incr i),(4>1,j--),
(3>1,j--),
(2>1,j--),
(1>1,don't incr j)

总共 7 次,即 (n+2) 次比较

【问题讨论】:

    标签: c quicksort


    【解决方案1】:

    使用您展示的算法,枢轴始终被选为数组的第一个元素。假设您获得了一个已经排序的数组,在这种情况下,在与n-1 元素进行比较之后,枢轴将转到第一个元素(原样),并且您将对两个数组递归调用快速排序,第一个与之前的元素枢轴(0个元素,一个空数组)和另一个具有枢轴之后的所有元素(n-1个元素)。在这种情况下,您将使用 n-1 元素的数组递归调用快速排序,该数组恰好再次排序,并且第一个元素(新的枢轴)将生成一个 0 元素的数组(在枢轴)、枢轴和n-2 元素的数组。你遵守顺序吗?

    由于代码中最坏的情况恰好发生在已经排序的数组中,通常快速排序只是将中间的元素作为枢轴,所以在这种情况下它也不会做任何事情,而是退化为每个大小为一半的数组时间(大小减一的一半——枢轴)。

    如果您遇到像以前一样的退化情况,您在第一遍中进行 n 次比较,然后进行 n-1 次比较,然后进行 n-2 次比较,总共 n*(n+1)/2 次比较,并且在每次除以 2 的情况下,每次经过 n 次比较,总共 log_2(n) 次,总共 n*log_2(n) 次比较。假设 n=1000000,在第一种情况下进行 1000001000000/2 = 200000500000 次比较,在 20*1000000 = 20000000 之前(少很多)

    【讨论】:

    • 在这种情况下,在与 n-1 个元素进行比较后,枢轴将转到第一个元素(原样),我不知道如何 n-1 个元素
    • 你总是在每次传递时得到所有 n 个元素的比较,但在退化的情况下你得到 n 次传递,因为 log_2(n) 在另一种情况下传递。
    • 在我的帖子的最后一部分中,我已经表明比较是 n+2 而不是 n-1
    • 在每次传递中,对于一个包含 n 个元素的数组,您将 n-1 个元素与枢轴进行比较,因此您需要进行 n-1 个比较。如果您将数组划分为子数组,则对每个子数组(长度为 n_i)进行 n_i-1 次比较,总共进行 $\sum_{i=0}^{i
    • 我不知道你做错了什么。我只是说,对于长度为 n_i 的数组,您将所有元素(除了枢轴)与它进行比较,因此您必须进行 n_i - 1 次比较。如果你赚得更多,你就是在做不必要的比较。不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2012-01-12
    • 2013-06-03
    • 2018-01-28
    • 1970-01-01
    • 2015-10-16
    • 2021-07-28
    相关资源
    最近更新 更多