算法设计与分析实验三

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三分治算法(2)
一、实验目的与要求
1、熟悉合并排序算法(掌握分治算法)
二、实验题
1、问题陈述:
对所给元素存储于数组中和存储于链表中两中情况,写出自然合并排序算
法.
2、解题思路:
将待排序元素分成大小大相同的两个集合,分别对两个集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合.自然排序是通过一次扫描待排元素中自然排好序的子数组,再进行子数组的合并排序.
三、实验步骤
程序代码:
#include <iostream.h>
const int N=100;//定义不可变常量N
//各个函数的声明
void ScanTarget(int target[], int n, int head[], int tail[]);
int CountHead(int head[]);
void MergeSort(int a[], int head[], int tail[], int m);
void MergePass(int x[], int y[], int s, int a[], int b[], int m);
void Merge(int c[], int d[], int l, int m, int r);
//主函数的定义
void main()
{
char a;
do
{
int target[N],head[N],tail[N];
int i=0,n,m;
for(; i<N; i++)
{
head[i]=-1;
tail[i]=-1;
}
cout<<"请输入需要排序的数列的总数:"<<endl;
cin>>n;
cout<<"请输入需要排序的数列:" <<endl;
for(i=0; i<n; i++)
cin>>target[i];
ScanTarget(target,n,head,tail);
m=CountHead(head);//调用求长度的函数
MergeSort(target,head,tail,m);//调用归并排序函数
cout<<"排序后:"<<endl;
for(i=0; i<n; i++)
cout<<target[i]<<" ";
cout<<endl;
cout<<"是否继续(y/n):"<<endl;
cin>>a;
}
while(a!='n' && a!='N');
}
void ScanTarget(int target[], int n, int head[], int tail[])//定义扫描待排数组的函数;{
int i,j=0,k=0;
head[k]=0;
k++;
for(i=1;i<n;i++)
{
if(target[i-1]>target[i])
{
tail[j++]=i-1;
head[k++]=i;
}
}
tail[j]=n-1;
}
int CountHead(int head[])//定义求长度的函数;
{
int i(0);
while(head[i]!=-1)
{
i++;
}
return i;//返回长度值
}
void MergeSort(int a[], int head[], int tail[], int m)//定义归并排序算法{
int b[N];
int s=1;
while(s<m)
{
MergePass(a,b,s,head,tail,m);
s+=s;
MergePass(b,a,s,head,tail,m);
s+=s;
}
}
void MergePass(int x[], int y[], int s, int a[], int b[], int m)//合并输出
{
int i=0;
while(i <= m-2*s)
{
Merge(x,y,a[i],b[i+s-1],b[i+2*s-1]);
i=i+2*s;
}
if(i+s < m)
{
Merge(x,y,a[i],b[i+s-1],b[m-1]);
}
else
{
for(int j=i; j<m; j++)
for(int k=a[j]; k<=b[j]; k++)
y[k]=x[k];
}
}
void Merge(int c[], int d[], int l, int m, int r)//合并已经排序的两个数组,即归并操作{
int i,j,k;
i=l;
j=m+1;
k=l;
while((i<=m) && (j<=r))
{
if( c[i] <= c[j] )
d[k++]=c[i++];
else d[k++]=c[j++];
}
if( i>m )
{
for(int q=j; q<=r; q++)
d[k++]=c[q];
}
else
{
for(int q=i; q<=m; q++)
d[k++]=c[q];
}
}
程序运行结果如下所示:
请输入需要排序的数列的总数:
5
请输入需要排序的数列:
13 78 34 5 66
排序后:
5 13 34 6
6 78
是否继续(y/n):
n
Press any key to continue。

相关文档
最新文档