了解快速排序算法及其最坏情况

时间:2014-11-03 14:25:37

标签: c quicksort

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

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

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;
}

我不是在这里写交换函数的定义,因为它是自我解释的。

现在让我们跟踪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

ques1.我对quicksort的理解是否正确?

ques2.在最坏的情况下,quicksort会进行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)个比较

1 个答案:

答案 0 :(得分:0)

使用您显示的算法,始终选择数据透视作为数组的第一个元素。假设你得到一个已经排序的数组,在这种情况下,在与它的n-1元素进行比较之后,pivot会转到第一个元素(就像它一样),你将为两个数组递归调用quicksort,第一个用于在pivot(0个元素,一个空数组)之前的元素和另一个在pivot(n-1个元素)之后的所有元素。在这种情况下,您将获得一个带有n-1元素数组的快速排序的递归调用,这些元素恰好再次排序,并且第一个元素(新数据透视图)将生成一个0的数组元素(在数据透视之前),数据透视表和n-2元素数组。你按照顺序进行了吗?

由于你的代码中最糟糕的情况恰好发生在一个已经排序的数组中,通常quicksort只是将元素作为枢轴放在中间,所以在这种情况下它也没有做任何事情,但是在半尺寸中退化每次都有阵列(大小减去一半 - 枢轴)。

如果你得到像前一个那样的退化情况,你会在第一遍中进行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(更少)之前