计算机数据结构试验报告hrbedu.docVIP

  • 5
  • 0
  • 约3.18千字
  • 约 6页
  • 2018-02-06 发布于河南
  • 举报
计算机数据结构试验报告hrbedu

实验名称:查询最高分 实验类型:综合性实验 1、问题描述 512人参与玩某游戏,从1~512给每个人分配一个编号,每个人的游戏得分在0~999之间,现要用不同方法查找出游戏参与者的最高分和次高分。要求: 自行产生512个的随机整数作为所有游戏参与者的得分。 输出所有游戏参与者(用编号表示)及其得分。 用顺序查找方法查找出其中取得最高分和次高分者及其分数,并输出。 锦标赛法查找出其中取得最高分和次高分者及其分数,并输出。 通过无序序列建堆和堆调整得到取得最高分者和次高分者及其分数,并输出。 比较不同方法的查找效率和各自的特点。 2、数据结构设计 根据题设,我们可以创建一个数据结构记录数字和编号,再对该数据结构进行初始化,如下: struct edge_t{ int to; elem_t len; }; struct heap{ heap_t h[MAXN*MAXN]; int n,p,c; void init(){n=0;} void ins(heap_t e){ for (p=++n;p1_cp(e,h[p1]);h[p]=h[p1],p=1); h[p]=e; } int del(heap_t e){ if (!n) return 0; for (e=h[p=1],c=2;cn_cp(h[c+=(cn-1_cp(h[c+1],h[c]))], h[n]);h[p]=h[c],p=c,c=1); h[p]=h[n--];return 1; } }; 3、算法设计 (1)首先声明一个比较大小的函数,如: int big(int l,int r) { if (l == r) return a[l]; else { int mid = (l+r) 1; return max(big(l,mid),big(mid+1,r)); } } (2)在主函数中进行随机数的生成,并将生成的随机数储存到之前定义的数组中,如: n = 512; srand(time(NULL)); // puts(Number of people :); // scanf(%d,n); for (int i=1;i=n;i++) { a[i] = rand()%1000; printf(%d %d\n,i,a[i]); } (3)然后用顺序查找的方法找出生成随机数中最高分和次高分,如下: int max = -1; int pos = -1; for (int i=1;i=n;i++) if (a[i] max) { max = a[i]; pos = i; } int smax = -1; int spos = -1; for (int i=1;i=n;i++) if (a[i] smax i != pos) { smax = a[i]; spos = i; } (4)随后再用竞标赛的方法对随机数进行查找,找出最高分和次高分,如下: heap h; h.init(); for (int i=1;i=n;i++) { heap_t tmp = {a[i],i}; h.ins(tmp); } heap_t tmp = h.h[1]; h.del(h.h[1]); 5、运行、测试与分析 运行程序,自动生成随机数,并且分别用顺序查找方法和锦标赛查找方法找出最高分和次高分,然后输出结果,如图9.1所示 图9.1 6、实验收获及思考 本次试验分别运用了顺序查找和锦标赛查找的方法进行了最大数和次大数的查找,让我对查询算法有了更深一层的理解。知道以后该怎样运用查找方法。 7、源码 #include iostream #include cstdio #include cstdlib #include cstring using namespace std; int n; int a[1000]; #define MAXN 200 #define inf 1000000000 typedef int elem_t; struct edge_t{ int to; elem_t len; }; #define _cp(a,b) ((a).d(b).d) struct heap_t{elem_t d;int v;}; struct heap{ heap_t h[MAXN*MAXN]; int n,p,c; void init(){n=0;} void ins(heap_t e){ for (p=++n;p1_

文档评论(0)

1亿VIP精品文档

相关文档