快速排序,堆排序和希尔排序

#快速排序

#include <iostream>

using namespace std;

int a[1000],n;
//一趟快排
int quickpass(int a[],int l,int r)
{
    
    
    int x;
    x=a[l];
    while(l<r)
    {
    
    
        while(l<r&&a[r]>=x) r--;
        if(l<r)
        {
    
    
            a[l]=a[r];
            l++;
        }
        while(l<r&&a[l]<=x) l++;
        if(l<r)
        {
    
    
            a[r]=a[l];
            r--;
        }
    }
    a[l]=x;
    return l;
}
//完整的快排
void quicksort(int a[],int l,int r)
{
    
    
    int pos;
    if(l<r)
    {
    
    
        pos=quickpass(a,l,r);
        quicksort(a,l,pos-1);
        quicksort(a,pos+1,r);
    }
}
int main()
{
    
    
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    quicksort(a,0,n-1);
    for(int i=0;i<n;i++)
    cout <<a[i]<<" ";
    return 0;
}

#堆排序

#include <iostream>

using namespace std;

int r[100],n;
//重建堆
void sift(int r[],int k,int m)
{
    
    
    int x;
    int i,j,finished=false;
    x=r[k];
    i=k;
    j=2*i;
    while(j<=m&&!finished)
    {
    
    
        if(j+1<=m&&r[j]<r[j+1]) j++;
        if(x>=r[j]) finished=true;
        else
        {
    
    
            r[i]=r[j];
            i=j;
            j=2*i;
        }
    }
    r[i]=x;
}
//建初堆
void creat_heap(int r[],int n)
{
    
    
    int i;
    for(i=n/2;i>=1;i--)
        sift(r,i,n);
}
//堆排序
void heapsort(int r[],int n)
{
    
    
    creat_heap(r,n);
    int i;int t;
    for(i=n;i>=2;i--)
    {
    
    
        t=r[1];
        r[1]=r[i];
        r[i]=t;
        sift(r,1,i-1);
    }
}
int main()
{
    
    
    cin>>n;
    int i;
    for(i=1;i<=n;i++)
        cin>>r[i];
    heapsort(r,n);
    for(i=1;i<=n;i++)
        cout<<r[i]<<" ";
    return 0;
}

这有一篇讲解堆排序的博文,写的很好,易懂,转载于博主阿顾同学:堆排序算法(图解详细流程)

#希尔排序

#include <iostream>

using namespace std;

int r[100],delta[100],n,dl=0;
//一趟希尔插入排序
void shellinsert(int r[],int n,int delta)
{
    
    
    int i,j;
    for(i=1+delta;i<=n;i++)
       if(r[i]<r[i-delta])
       {
    
    
           r[0]=r[i];
           for(j=i-delta;j>0&&r[0]<r[j];j-=delta)
               r[j+delta]=r[j];
           r[j+delta]=r[0];
           //cout<<r[i-delta]<<" "<<r[i]<<endl;
       }
}
//希尔排序
void shellsort(int r[],int n,int delta[],int dl)
{
    
    
    int i;
    for(i=0;i<dl;i++)
        shellinsert(r,n,delta[i]);
}
int main()
{
    
    
    cin>>n;
    int i,t;
    t=n;
    for(i=1;i<=n;i++)
        cin>>r[i];
    //求间隔
    for(i=0;;i++)
    {
    
    
        if(t)
        {
    
    
            delta[i]=t/2;
            t/=2;dl++;
        }
        else
            break;
    }
    shellsort(r,n,delta,dl);
    for(i=1;i<=n;i++)
      cout <<r[i]<<" ";
    return 0;
}

#比较

排序算法 时间复杂度 最好情况 最坏情况 空间复杂度
快速排序 O( nlog2n ) O( nlog2n ) O(n^2) O( log2n )
堆排序 O( nlog2n ) O( nlog2n ) O( nlog2n ) O(1)
希尔排序 O(n^1.5) O(1)

おすすめ

転載: blog.csdn.net/qq_50932477/article/details/117604324