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

#快速排序

#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)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T1009∞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值