
楼主 |
课程地址:点击查看本课程最新任务列表
用户购买价格:10金币 本套试题答案购买后显示 购买本答案
【上面答案为下列试题答案,请核对试题后再购买】www.botiku.com零号电大
请在实验1—实验7中选择其中一个,认真完成并提交实验报告,老师会根据你的实验报告给出成绩,本次实践活动满分100分,占形成性考核成绩的20%,你一定要认真完成哦!
实验7 排序
1 冒泡排序的改进算法
问题描述
某班学生成绩信息表中每个学生的记录包含各门功课的成绩和平均成绩,以及按平均成绩的排名等信息,要求从键盘输入每个学生各门功课的成绩,计算出平均成绩,按平均成绩由高到低对信息表的记录重新排序,并定出每位同学的名次,打印排序后的信息表。
实验要求
(1)建立学生成绩信息表,计算平均成绩。
(2)用冒泡法对平均成绩排序,程序中要求一旦序列被排好序就结束相应排序操作。
如果对于本实验无从下手,你可以通过查看“设计思路”,帮助你开拓思维。
(1)用结构数组存储学生成绩信息表。
(2)在某趟冒泡排序中没有发生元素间的交换则说明已排好序。
如果对于自己编写的程序不知道是否正确,你可以通过查看“实验设计”进行核查。
程序代码如下:
/*实验6.1 冒泡法排序的改进算法*/
#include
#define N1 5 /*学生人数*/
#define N2 3 /*课程门数*/
/*定义学生信息类型*/
typedef struct{
char name[10]; /*姓名*/
int score[N2]; /*N2门课程成绩*/
float avg; /*平均成绩*/
}Student;
void bsort(Student*a,int n); /*改进的冒泡排序*/
void main()
{
Student a[N1];
int i,j;
printf("请输入 %d 位学生信息(姓名、 %d 门课程成绩)\n\n",N1,N2);
for(i=0; i
{
printf("输入第 %d 位学生信息: ",i+1);
scanf("%s",a.name);
a.avg=0;
for(j=0; j
{
scanf("%d",&a.score[j]);
a.avg+=a.score[j];
}
a.avg/=N2; /*计算平均成绩*/
}
bsort(a,N1); /*排序*/
/*排序后的学生信息表*/
printf("\n名次 姓名 ");
for(i=0; i
printf("课程%d ",i+1);
printf("平均成绩\n");
for(i=0; i
{
printf("%-4d %-4s ",i+1,a.name);
for(j=0; j
printf("%-6d",a.score[j]);
printf("%-6.1f\n",a.avg);
}
}
/*改进的冒泡排序,按平均成绩从高到低排序*/
void bsort(Student *a,int n)
{
Student temp;
int i,j,flag;
for(j=0; j
{
flag=0;
for(i=0; i
if(a.avg
{
flag=1; /*本趟有元素交换*/
temp=a;
a=a[i+1];
a[i+1]=temp;
}
if(flag==0) break; /*没有元素交换,说明已排好序*/
}
}
如果已运行程序得出实验结果,你可以查看“测试结果”进行检测。
程序运行结果如下:
程序运行结果如下:
通过本实验的学习,有如下收获:
(1)学生人数和课程门数分别用常量N1和N2定义,便于程序的修改与测试。
(2)N2门课程成绩在结构类型定义中用一维数组存放,提高程序的通用性。
2 堆排序
问题描述
阅读筛选和建堆的程序,针对某一个待排序的序列,通过人工跟踪程序的执行,完成排序的全过程。
实验要求
(1)掌握建堆、筛选的基本原理和算法步骤。
(2)写出主函数,试运行堆排序的程序。
(3)掌握堆排序的算法程序,能针对实例按步骤人工完成建堆和排序的过程。
请认真阅读以上实验的问题描述,按照实验要求认真独立完成实验。如果在实验过程中遇到困难,你可以通过以下辅助方式,顺利完成本实验。
如果对于本实验无从下手,你可以通过查看“设计思路”,帮助你开拓思维。
(1)筛选是建堆的基本算法。
(2)把要排序序列看成一棵完全二叉树,用循环方式从最后一个非叶结点(设序号为i)开始,逐次对序号为i,i-1,……的结点,直至根结点调用筛选算法,完成建堆。
(3)不断通过堆顶元素与堆中最后一个元素的交换并筛选,完成排序。
如果对于自己编写的程序不知道是否正确,你可以通过查看“实验设计”进行核查。
程序代码如下:
/*实验6.2 堆排序*/
#include
#define N 8
/*定义待排序记录类型*/
typedef struct
{
int key;
}NODE;
void heapsift(NODE a[],int i,int n); /*筛选算法*/
void heapsort(NODE a[],int n); /*堆排序*/
void display(NODE a[],int n); /*输出关键字序列*/
void main()
{
NODE a[N+1]={0,40,80,65,100,14,30,55,50}; /*定义记录数组*/
printf("初始关键字序列为:");
display(a,N);
heapsort(a,N);
printf("\n堆排序后的关键字序列为:");
display(a,N);
}
/*筛选算法*/
void heapsift(NODE a[],int i,int n)
{
NODE temp;
int j;
temp=a;
j=2*i; /*j为i的左孩子*/
while(j<=n) /*最多调整到最后一个非叶结点*/
{
if(j+1<=n && a[j].key > a[j+1].key)
j++; /*j指向左右孩子中关键字较小者*/
if(temp.key > a[j].key)
{
a=a[j]; /*较小子结点记录调整到父结点位置*/
i=j; /*准备继续对子结点进行筛选*/
j=2*i;
}
else
break; /*已满足小根堆,筛选结束*/
}
a=temp;
}
/*堆排序,实现按关键字从大到小排序*/
void heapsort(NODE a[],int n)
{
int i;
NODE temp;
/*利用筛选算法建初始小根堆*/
printf("\n建初始小根堆过程如下:\n");
for(i=n/2; i>=1; i--)
{
printf("筛选%3d后:",a.key);
heapsift(a,i,n);
display(a,n);
}
printf("\n初始小根堆序列为:");
display(a,n);
/*利用小根堆排序*/
printf("\n堆排序每趟排序状态如下:\n");
for(i=n; i>1; i--) /*共进行(n-1)趟排序*/
{
/*将最小值与筛选序列最后一个元素交换*/
temp=a[1];
a[1]=a;
a=temp;
heapsift(a,1,i-1); /*对根元素继续筛选,重新构成小根堆*/
printf("(%d)",n-i+1);
display(a,n);
}
}
/*输出关键字序列*/
void display(NODE a[],int n)
{
int i;
for(i=1; i<=n; i++)
printf("%4d",a.key);
printf("\n");
}
如果已运行程序得出实验结果,你可以查看“测试结果”进行检测。
程序运行结果如下:
通过本实验的学习,有如下收获:
(1)为便于调用堆排序算法,初始化的记录数组中下标1~n中对应存储n个数据。
(2)对于待排序的n个数据,筛选的次数为n/2次,堆排序趟数为n-1。
(3)可利用小根堆实现按关键字从大到小排序,反之利用大根堆可实现按关键字从小到大排序。
完成这个实验的成绩占形成性考核成绩的20%,你可以在这里提交。 |
|