“深度优先稳定原地归并排序的高效算法”C语言实现

本学期《算法分析与设计》课程考试内容为:

1、检索2009.1-2019.12时段内国内外核心期刊,选择一篇满足以下要求的文献进行研读
(1) 分治算法、动态规划算法、贪心算法、回溯算法、分治限界算法、随机化算法相关的算法改进或算法领域应用类论文;
(2) 与装载问题、背包问题、旅行商问题求解相关的先进算法设计相关论文。
2、研读考核包括以下两部分
(1) 代码部分,在截止日期前按要求提交到PTA;
(2) 文献研读报告。
3、代码提交要求
(1) 阅读文献(pdf);
(2) 算法改进类文献:基线算法代码、改进算法代码;算法应用类文献:领域应用问题求解算法代码;
(3) 算法测试数据集。

本着“前人栽树,后人乘凉”的思想,把找到的一篇论文里的代码用C语言实现出来

先贴出论文原文《深度优先稳定原地归并排序的高效算法》在线阅读点这里

代码部分(作者写的很好,跟着论文的伪代码直接可以实现)

#include <stdio.h>

int numlist[100];
int lower(int from,int to,int val)
{
    int len = to - from;
    int half;
    int mid;
    while(1)
    {
        if(len <= 0)
            return from;
        half = len/2;
        mid = from + half;
        if(numlist[mid]>=numlist[val])
        {
            len = half;
            continue;
        }
        from = mid + 1;
        len = len - half -1;
    }
}

int upper(int from,int to,int val)
{
    int len = to - from;
    int half;
    int mid;
    while(1)
    {
        if(len <= 0)
            return from;
        half = len/2;
        mid = from + half;
        if(numlist[mid]>numlist[val])
        {
            len = half;
            continue;
        }
        from = mid + 1;
        len = len - half -1;
    }
}

int gcd(int m,int n)
{
    if(n==0)
        return m;
    return gcd(n,m%n);
}

void numrotate(int from,int mid,int to)
{
    if(from==mid || mid==to)
        return;
    int n=gcd(to-from,mid-from);
    int temp;
    int shift;
    int p1,p2;
    while(n)
    {
        n--;
        temp=numlist[from+n];
        shift=mid-from;
        p1=from+n;
        p2=from+n+shift;
        while(p2!=from+n)
        {
            numlist[p1]=numlist[p2];
            p1=p2;
            p2=p2+shift;
            if(p2>=to)
            {
                p2=p2-(to-from);
            }
        }
        numlist[p1]=temp;
    }
}

void numswap(int &a,int &b)
{
    int t;
    t=a;
    a=b;
    b=t;
}

void nummerge(int from,int pivot,int to,int l1,int l2)
{
    if(l1==0 || l2==0)
        return;
    if(l1+l2==2)
    {
        if(numlist[from]>numlist[pivot])
        {
            numswap(numlist[from],numlist[pivot]);
            return;
        }
    }
    else
    {
        int l1s,l2s,cut1,cut2;
        if(l1>l2)
        {
            l1s=l1/2;
            cut1=from+l1s;
            cut2=lower(pivot,to,cut1);
            l2s=cut2-pivot;
        }
        else
        {
            l2s=l2/2;
            cut2=pivot+l2s;
            cut1=upper(from,pivot,cut2);
            l1s=cut1-from;
        }
        numrotate(cut1,pivot,cut2);
        int newpivot=cut1+l2s;
        nummerge(from,cut1,newpivot,l1s,l2s);
        nummerge(newpivot,cut2,to,l1-l1s,l2-l2s);
    }
}

void numsort(int from,int to)
{
    if(to-from<2)
        return;
    int mid=(from+to)/2;
    numsort(from,mid);


    numsort(mid,to);
    nummerge(from,mid,to,mid-from,to-mid);
}

int main()
{
    int listcount;
    while(~scanf("%d",&listcount))
    {
        for(int i=0;i<listcount;i++)
        {
            scanf("%d",&numlist[i]);
        }
        printf("原始数据:\n");
        for(int i=0;i<listcount;i++)
        {
            if(i!=listcount-1)
                printf("%d ",numlist[i]);
            else
                printf("%d\n",numlist[i]);
        }
        numsort(0,listcount);
        printf("排序数据:\n");
        for(int i=0;i<listcount;i++)
        {
            if(i!=listcount-1)
                printf("%d ",numlist[i]);
            else
                printf("%d\n",numlist[i]);
        }
    }
    return 0;
}

引用

** 白宇, 郭显娥. 深度优先稳定原地归并排序的高效算法[J]. 计算机应用, 2013, 33(04):1039-1042.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值