快速排序问题是一个时间复杂度为O(nlgn)的算法,下面就是快速排序的具体实现的过程,希望大家能够给一些建议。
下面我们来研究一下最坏情况下这个算法的时间复杂度,以及什么是这个算法的最坏情况。
1.最坏情况的分析,最坏情况就是partition划分的过程当中,因为其时间复杂度为O(n),而每一次花分都是一边n-1另一边是1,所以这个时候
T(n)=T(n-1)+O(n),所以总的来说时间复杂度就是O(n^2),这是最坏情况下的时间复杂度。
2.最优情况的分析,经过前面分析的情况之后,我们就会了解最优的情况就是每次划分都是使该序列划分为一半,加速了排序完成的过程,所以T(n)=2T(n/2)+O(n),所以最好情况下的时间复杂度就是O(nlgn)。
3。平均情况下,快速排序的时间复杂度可以使用求数学期望的方式,,其渐进解是
,公式引自某知乎用户,实在太难敲。
#include<iostream>
using namespace std;
#include<stdio.h>
int Partition(int a[],int p,int r)
{
int i=p,j=r+1;
int x=a[p];
while(true)
{
while(a[++i]<x&&i<r);
while(a[--j]>x);
if(i>=j)
break;
swap(a[i],a[j]);
}
a[p]=a[j];
a[j]=x;
return j;
}
void Quicksort(int a[],int p,int r)
{
if(p<r)
{
int q=Partition(a,p,r);
Quicksort(a,p,q-1);
Quicksort(a,q+1,r);
}
}
int main()
{
int a[]={1,3,4,2};
int n=4;
Quicksort(a,0,n-1);
for(int i=0;i<n;i++)
printf("%d\t",a[i]);
return 0;
}