本学期《算法分析与设计》课程考试内容为:
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.