分治法实现归并排序算法算法设计与分析实验报告

  • 格式:doc
  • 大小:75.00 KB
  • 文档页数:8

算法设计与分析实验报告

实验名称 分治法实现归并排序算法 评分

实验日期 年 月 日 指导教师

姓名 专业班级 学号

一.实验要求

1.了解用分治法求解的问题:当要求解一个输入规模为n,且n的取值相当大的问题时,

如果问题可以分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1

2.掌握分治法的一般控制流程。

DanC(p,q)

global n,A[1:n]; integer m,p,q; // 1pqn

if Small(p,q) then return G(p,q);

else m=Divide(p,q); // pm

return Combine(DanC(p,m),DanC(m+1,q));

endif

end DanC

3.实现典型的分治算法的编程与上机实验,验证算法的时间复杂性函数。

二.实验内容

1.编程实现归并排序算法,程序中加入比较次数的计数功能,输出排序结果和比较次数。

2.输入10组相同的数据,验证排序结果和完成排序的比较次数。

3.与复杂性函数所计算的比较次数比较。

4.用表格列出比较结果。

5.给出文字分析。

三.程序算法

1. 归并排序算法

procedure MERGESORT(low,high)

//A(low;high)是一个全程数组,它含

有high-low+1≥0个待排序的元素//

integer low,high;

if low

call MERGESORT(low,mid) //将一个子集合排序//

call MERGESORT(mid+1,high) //将另一个子集合排序

call MERGE(low,mid,high) //归并两个已排序的子集合//

endif

end MERGESORT

归并两个已排序的集合

procedure MERGE(low,mid,high)

//A(low:high)是一个全程数组//

//辅助数组B(low;high)//

integer h,i,j,k;

h←low;i←low;j←mid+1;

while h≤mid and j≤high do //当两个集合都没取尽时//

if A(h)≤A(j) then B(i) ←A(h);h←h+1

else B(i) ←A(j);j←j+1

endif

i←i+1

repeat

if h>mid then

for k←j to high do //处理剩余的元素//

B(i) ←A(k);i←i+1

repeat

else for k←h to mid do

B(i) ←A(k);i←i+1

repeat

endif

将已归并的集合复制到A

end MERGE

2. 快速排序算法

QuickSort(p,q)

//将数组A[1:n]中的元素

A[p], A[p+1],  , A[q]按不降次序排列,

并假定A[n+1]是一个确定的、且大于

A[1:n]中所有的数。//

int p,q; global n, A[1:n];

if p

j=Partition(p, q+1); // 划分后j成为划分元素的位置 QuickSort(p,j-1);

QuickSort(j+1,q);

endif

end QuickSort

procedure PARTITION(m,p)

//退出过程时,p带着划分元素所在的下标位置。//

integer m,p,i;global A(m:p-1)

v←A(m);i←m //A(m)是划分元素//

loop

loop i←i+1 until A(i)≥v repeat //i由左向右移//

loop p←p-1 until A(p)≤v repeat //p由右向左移//

if i

then call INTERCHANGE(A(i),A(p)) //A(i)和A(p)换位//

else exit

endif

repeat

A(m) ←A(p);A(p) ←v //划分元素在位置p//

End PARTITION

四.程序代码

1. 归并排序

#include

#include

#include

#include

#define M 11

typedef int KeyType;

typedef int ElemType;

struct rec{

KeyType key;

ElemType data;

};

typedef rec sqlist[M];

class guibing{

public:

guibing(sqlist b)

{

for(int i=0;i

r[i]=b[i]; }

void output(sqlist r,int n)

{

for(int i=0;i

cout<

cout<

}

void xuanze(sqlist b,int m,int n)

{

int i,j,k;

for(i=m;i

{

k=i;

for(j=i;j

if(b[k].key>b[j].key) k=j;

if(k!=i)

{

rec temp=b[k];

b[k]=b[i];

b[i]=temp;

}

}

}

void merge(int l,int m,int h,sqlist r2)

{

xuanze(r,l,m);

xuanze(r,m,h);

output(r,M);

int i,j,k;

k=i=l;

for(j=m;i

{

if(r[i].key<=r[j].key)

{

r2[k]=r[i];

i++;

}

else {

r2[k]=r[j];

j++;

}

output(r2,M);

}

while(j

{

r2[k]=r[j];

j++;

k++;

}

while(i<=m)

{

r2[k]=r[i];

i++;

k++;

}

output(r2,M);

}

private:

sqlist r;

};

void main()

{

cout<<"guibingfa1运行结果:\n";

sqlist a,b;

int i,j=0,k=M/2,n=M;

srand(time(0));

for(i=0;i

{

a[i].key=rand()%80;b[i].key=0;

}

guibing gx(a);

cout<<"排序前数组:\n";

gx.output(a,M);

cout<<"数组排序过程演示:\n";

gx.merge(j,k,n,b); cout<<"排序后数组:\n";

gx.output(b,M);

cin.get();

}

2. 快速排序

#include

#include

#include

#include

#define MAXI 10

typedef int KeyType;

typedef int ElemType;

struct rec{

KeyType key;

ElemType data;

};

typedef rec sqlist[MAXI];

class kuaisu

{

public:

kuaisu(sqlist a,int m):n(m)

{

for(int i=0;i

}

void quicksort(int s,int t)

{

int i;

if(s

i=part(s,t);

quicksort(s,i-1);

quicksort(i+1,t);

}

else return;

}

int part(int s,int t)

{

int i,j;

rec p;