算法导论第七章笔记

快速排序

快速排序其实也是用到了分治算法的思想,快速排序采用双向查找的策略,每一趟选择当前所有子序列中的一个数为界限,将子序列中比界限小的前移,比界限大的后移,当本趟所有子序列都按上述规则划分完毕后将会得到新的一组更短的子序列,他们将成为下趟划分的初始序列集。这里的程序使用的是快速排序的随机版本,所以是输入数据的划分是比较平均的

*时间复杂度:最坏情况:O(n^2) 平均情况:O(nlog(n))

#include 
#include 
using namespace std;

int PARTITION (int A[],int l,int r)
{
     
    int x=A[r];
    int i=l-1;
    for(int j=l;j<=r-1;j++)
    {
     
        if (A[j]<=x)
        {
     
            i++;
            swap(A[i],A[j]);
        }
    }
    swap(A[i+1],A[r]);
    return i+1;
}
int RANDOMIZED_PARTITION (int A[],int l,int r)
{
     
    int i=rand()%(r-l+1)+l;
    swap(A[r],A[i]);
    return PARTITION(A,l,r);
}
void RANDOMIZED_QUICKSORT (int A[],int l,int r)
{
     
    if (l<r)
    {
     
        int q=RANDOMIZED_PARTITION(A,l,r);
        RANDOMIZED_QUICKSORT(A,l,q-1);
        RANDOMIZED_QUICKSORT(A,q+1,r);
    }
}
void printA(int A[],int l,int r)
{
     
    for(int i=l;i<=r;i++)
        cout<<A[i]<<" ";
    cout<<endl;
}
int main()
{
     
    int n,l,r;
    int A[20];
    cin>>n;
    for (int i=1;i<=n;i++)
        cin>>A[i];
    cout<<"请输入要排序的范围l r";
    cin>>l>>r;
    RANDOMIZED_QUICKSORT(A,l,r);
    printA(A,l,r);
    return 0;
}

你可能感兴趣的:(算法,快速排序)