西南交通大学算法实验2.2

题目:实验 2.2 设计实验比较快速排序,归并排序以及堆排序算法的时间效率

// 算法实验2.2
#include<bits/stdc++.h>
#include<random>
using namespace std;
typedef long long ll;
int n;
mt19937 random(time(0));
ofstream ofs("data.txt");
vector<int> a,b,c,arr;

void quick_sort(int l, int r)
{
    if(l>=r)
        return;
    int i=l,j=r;
    int t=a[l];
    while(i-j)
    {
        while(i-j && a[i]>=t)
            i++;
        while(i-j && a[j]<=t)
            j--;
        swap(a[i],a[j]);
    }
    swap(a[i],a[l]);
    quick_sort(l,i-1);
    quick_sort(i+1,r);
}

void merge_sort(int l, int r)
{
    if(l==r)
        return;
    int mid=(l+r)/2;
    merge_sort(l,mid), merge_sort(mid+1,r);
    int i=l,j=mid+1,k=l;
    while(i<=mid && j<=r)
    {
        if(a[i]<a[j])
            b[k++]=a[i++];
        else
            b[k++]=a[j++];
    }
    while(i<=mid)
        b[k++]=a[i++];
    while (j<=r)
        b[k++]=a[j++];
    for(i=l;i<=r;i++)
        a[i]=b[i];
}

void heap_sort()
{
    int cnt=0;
    auto push=[&](int x)    // 压入
    {
        c[++cnt]=x;
        int t=cnt;
        while(t/2 && c[t/2]>c[t])   // 上浮
        {
            swap(c[t],c[t/2]);
            t/=2;
        }
    };

    auto down=[&](auto down, int u)->void     // 下沉
    {
        int lc=u*2,rc=lc+1;
        int v=u;
        if(lc<=cnt && c[v]>c[lc])   v=lc;
        if(rc<=cnt && c[v]>c[rc])   v=rc;
        if(u-v)
        {
            swap(c[u],c[v]);
            down(down,v);
        }
    };

    auto pop=[&]()      // 删除
    {
        a[1]=a[cnt--];
        down(down,1);
    };

    for(int i=0;i<n;i++)
        push(arr[i]);
}

void solve(int m)
{
    n=m;
    a.clear(),b.clear(),c.clear(),arr.clear();
    a.resize(2*n),b.resize(2*n),c.resize(2*n),arr.resize(n);
    int i;
    for(i=0;i<n;i++)
    {
        arr[i]=random();
        a[i]=b[i]=arr[i];
    }

    clock_t s1,s2,s3,e1,e2,e3;
    
    s1=clock();
    quick_sort(0,n);
    e1=clock();

    s2=clock();
    merge_sort(0,n);
    e2=clock();
    
    s3=clock();
    heap_sort();
    e3=clock();
    
    ofs<<setw(7)<<n<<'\t'
      <<setw(7)<<(e1-s1)<<'\t'
      <<setw(7)<<(e2-s2)<<'\t'
      <<setw(7)<<(e3-s3)<<'\n';
}

int main()
{
    if(!ofs.is_open())
    {
        cout<<"Failed to open data.txt\n";
        return 0;
    }
    for(int i=1e3;i<1e5;i+=1e3)
        solve(i);
    for(int i=1e5;i<=1e6;i+=1e5)
        solve(i);
    ofs.close();
}

 更多算法实验代码: 我的github仓库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你 的 太 阳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值