(1)时间复杂度
最差情况下时间复杂度
最差的情况就是每一次取到的元素就是数组中最小/最大的,这种情况其实就是冒泡排序了(每一次都排好一个元素的顺序)
这种情况时间复杂度就好计算了,就是冒泡排序的时间复杂度:T[n] = n * (n-1) = n^2 + n;
综上所述:快速排序最差的情况下时间复杂度为:O( n^2 )
平均时间复杂度
快速排序的平均时间复杂度也是:O(nlogn)
(2)空间复杂度
其实这个空间复杂度不太好计算,因为有的人使用的是非就地排序,那样就不好计算了(因为有的人用到了辅助数组,所以这就要计算到你的元素个数了);我就分析下就地快速排序的空间复杂度吧;
首先就地快速排序使用的空间是O(1)的,也就是个常数级;而真正消耗空间的就是递归调用了,因为每次递归就要保持一些数据;
最优的情况下空间复杂度为:O(logn) ;每一次都平分数组的情况
最差的情况下空间复杂度为:O( n ) ;退化为冒泡排序的情况
注意点:
(1)递归调用的区间:[l,pivot-1],[pivot+1,r]
(2)加上等于号,可以排序有重复值的数组
A[low]<=key A[high]>=key
int partition(int A[], int low, int high)
{
int key = A[low]; //key是基准
while (low != high) //当low==high时,退出while循环
{
while (low<high&&A[high]>=key) high--; //当low=high时,退出while
A[low]=A[high];
while (low<high&&A[low]<=key) low++;
A[high] = A[low];
}
A[low] = key;
return low;
}
void QSort(int A[], int l,int r)
{
if (l < r)
{
int pivot = partition(A, l, r);
QSort(A, l, pivot-1);
QSort(A, pivot + 1, r);
}
}
int main()
{
int A[] = { 12,10,2,4,5,4,5};
int len = sizeof(A) / sizeof(A[0]) ;
QSort(A, 0, len - 1);
for (int i = 0; i < len; i++)
printf("%5d", A[i]);
printf("\n");
}
快速排序
最新推荐文章于 2024-07-17 10:35:12 发布