当前位置:文档之家› 归并排序分治策略的设计与实现

归并排序分治策略的设计与实现

实验名称归并排序分治策略的设计与实现实验方案实验成绩实验日期实验室信息系统设计与仿真室I 实验操作
实验台号班级姓名实验结果
一、实验目的
1、熟悉分治法求解问题的抽象控制策略;
2、熟悉在顺序存储表示下求解分类问题的递归算法设计;
3、通过实例转换, 掌握分治法应用。

二、实验任务
①从文件中读取数据信息;
②利用归并排序算法,进行排序;
③输出排序结果。

三、实验设计方案
1、结构体设计
用数组存放排序数据。

2、自定义函数设计
①函数原型声明
int input(int A[]); //从文件读入待排序的数据
void merge(int A[],int low,int mid,int high); // 两个相邻有序数组的归并
void mergesort(int A[],int low,int high); // 归并排序
void input(int A[], int n); // 输出排序结果
②两个相邻的有序子数组的合并
思路:从两个已排好序的子数组的首元素开始,依次比较大小,按从小到大的顺序存放在b[]数组中,然后转存到A[]数组中。

void merge(int A[],int low,int mid,int high)
{
int b[N];
int i,j,k = 0;
int l = low; //已排序部分1的起始下标
int h = mid+1; //已排序部分2的起始下标
while(l <= mid && h <= high) //两个有序部分合并到b数组中
if(A[l] < A[h])
b[k++] = A[l++];
else
b[k++] = A[h++];
while(l <= mid) // 剩余部分1
b[k++] = A[l++];
while(h <= high) // 剩余部分2
b[k++] = A[h++];
for(i=0,j=low;i<k;i++,j++) //将排好序的数组中的数复制到原来的A[]数组中去A[j] = b[i];
}
③整个数组的分治归并
思路:利用递归思想,将整个数组分为两个(可递归排序)的子数组,然后进行归并。

void mergesort(int A[],int low,int high){
int mid; //切分点
if(low < high){// 当low小于high的时候,可继续分治
mid = (low+high)/2; //递归思想
mergesort(A,low,mid); //先分治
mergesort(A,mid+1,high);
merge(A,low,mid,high); //再归并
}
}
3、主函数设计
思路:主函数实现实验任务的基本流程。

void main()
{
int A[N],n; //定义数组A
n=input(A); //读入文件数据到数组A,返回数据个数
mergesort(A,0,n-1); //对数组A进行归并排序
output(A,n); //输出排序结果
}
四、测试
1、测试数据
下面测试数据存放在in.txt文件中,第一行表示数据个数,第二行表示数据内容。

10
10 11 2 6 9 7 4 1 3 5
2、测试结果
编码结果存放在out.txt文件中:
1 2 3 4 5 6 7 9 10 11
五、总结与讨论
1、问题与错误
2、经验与收获
3、改进与设想
六、源代码。

相关主题