快速排序问题

来源:互联网 发布:农村淘宝的前景怎么样 编辑:程序博客网 时间:2024/04/30 01:58

快速排序问题是一个时间复杂度为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。平均情况下,快速排序的时间复杂度可以使用求数学期望的方式,C(n)=(n-1)+\frac{1}{n}\sum_{j=0}^{n-1}[C(j)+C(n-j-1)],其渐进解是2n\ln n,公式引自某知乎用户,实在太难敲。

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

0 0
原创粉丝点击