数据结构实验——排序算法的实现与分析

前言

到目前为止,8个数据结构实验在这里就全部更完啦(撒花)!我那一段难忘的周二晚课时光也告一段落,整体来说,有赶课的折腾,有调错的崩溃,也有故意迟到五分钟的惬意,用GPT生成我想要的东西的爽快......

当然也有折磨的实验总评86分呜呜呜,不过遗憾也都是过去了,接下来我要学的是计网实验、计组实验、数据库实验、密码实验......3G大学我谢谢你,有缘有时间再更。

那就希望我的博客能帮到你吧,不是那种应付式的帮,是能借我的讲解让看客更懂一些,哪怕一些。如果真要找,还不如直接去找那些阅读量1w+的文章,那些大佬讲原理比我清楚。

实验实习过程步骤(注意是主要关键步骤,不是所有步骤,适当文字+截图说明)

排序算法是一个再熟悉不过的领域,选择排序、冒泡排序、插入排序、快速排序、桶排序等等。大一C语言第八章就讲过选择排序,尤其是对于这种成绩排序的题目,我实在不想手搓快速排序,太杀鸡用牛刀了,为了避免老师怀疑我在水题解,咳咳先放一张图,我真的只是懒,不是不会写哈哈哈。

选择排序的算法如下,实际上就是找谁后面的数字谁比当前的数字更大,然后往前放。复杂度为O(n^2)。代码给大一小朋友都会写,但是实际上我出了很多问题。

图来源:【排序算法】快速排序(C语言)_c语言快速排序-CSDN博客

主要是很多细节问题,零碎的细节不讲了,讲两个重要的细节:

第一个细节是我想用len全局变量一把梭,当成n这样一个位置,这个没问题,但是咱们题目是while循环直到输入0 0截止,所以n是需要自己算的。我一开始是len--,但实际上要是len-=2,问题出在len最后指的地方是在0 0后面,但是我要找到0 0前面的位置,那差值应该是2。

第二个细节是我写了个pi.score<pj.score,i是定点,我们要找的是后面的最大点,所以需要不断迭代更新最大值点位,否则这样排序还是乱序,再一个如果是ij比较,那你设置k是来干嘛的。

只能说学海无涯,需要时时温故而知新,真别觉得自己多厉害,不去写别的排序方法是会忘记的,这个排序我都纠错纠正了很久。

其实排序完这题真正的关键点还没说完,就是这个成绩排名到底怎么去记录,因为有同分的。我的思路是dp,可能我对dp理解还不够深入,我的意思就是一条线走到底不需要回头。复杂度就是0(n)。怎么做呢,初始化num是排名,让后面的数跟前面的数比较,如果不等,那么num++,然后把每个num都赋值到对应的人上面。(我觉等更难的是1 2 2 4 4 4 7这种,还更难改,而这个才是我们考试真正采用的排名方法。)

至此,这题就做完啦!排序你怎么这么博大精深,真的折腾。

实验实习结果及分析

符合题意,而且也符合大多数排名情况。

实验遇到的问题及解决办法,实验心得体会及对此实验的意见或建议(有就写,无可不写)

如上,学海无涯,需要时时温故而知新,真别觉得自己多厉害,不去写别的排序方法是会忘记的,这个排序我都纠错纠正了很久。排序你怎么这么博大精深,真的折腾。

搬运工有话说

我在这里防抄袭设置的两个错误,就是我上面说的对应的两个点,自己找吧。

Code:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct student{ //学生信息定义
	char name[8]; //学生姓名
	double score; //学生成绩
}STUDENT;

STUDENT p[20];
int rank[20];
int len=1;

void input();
void Mysort();
void ranking();
void output();

int main()
{
	input();
	Mysort();
	ranking();
	output();
	return 0;
}

void input()
{
	do
	{
		scanf("%s %lf",p[len].name,&p[len].score);
		getchar();
		len++;
	}while(p[len-1].score!=0);
	len-=1;//0 0在假想len的上一层,而输入0 0,len还往上走了一层,因此减2 
}
void Mysort()
{
	int i,j,k;
	double t;
	char temp[10];
	for(i=1;i<=len-1;i++){
		k=i;
		for(j=i+1;j<=len;j++){
			if(p[i].score<p[j].score)//
			{
				k=j;
			}		
		}
		
		if(k!=i){
			t=p[k].score;
			p[k].score=p[i].score;
			p[i].score=t;
			
			strcpy(temp,p[k].name);
			strcpy(p[k].name,p[i].name);
			strcpy(p[i].name,temp);
		}
	}
	return ;
}
void ranking()
{
	int num=1;
	rank[1]=num;
	for(int i=2;i<=len;i++){
		if(p[i].score!=p[i-1].score){
			num++;//名次 
		}
		rank[i]=num;
	}
}
void output()
{
	for(int i=1;i<=len;i++)	{
		printf("%d %s %.2lf\n",rank[i],p[i].name,p[i].score);
	}
}

测试点:
张三 80.00
李四 96.00
王五 90.00
郑六 78.00
田七 85.00
李明 90.00
0 0

完结 完结 完结 ✿✿ヽ(°▽°)ノ✿撒花 撒花 撒花✿✿ヽ(°▽°)ノ✿

感谢愿意看到底的你们!

相关推荐
卷福同学19 小时前
不用服务器,不用配环境,我10分钟上线了一个AI Agent
人工智能·后端·算法
问君能有几多愁~21 小时前
C++ 数据结构复习笔记
数据结构·c++·笔记
至乐活着21 小时前
深入解析跳表SkipList:原理、实现与性能优化实战
数据结构·算法·跳表·skiplist·java实现
Drone_xjw21 小时前
从 GDB 到 CDB:C/C++ 程序调试的两把“手术刀”
c语言·开发语言·c++
Jerry1 天前
LeetCode 383. 赎金信
算法
ai产品老杨1 天前
H264 H265视频分析常见问题和排查清单
人工智能·算法·音视频
Jerry1 天前
LeetCode 454. 四数相加 II
算法
可编程芯片开发1 天前
基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真
算法
Jerry1 天前
LeetCode 202. 快乐数
算法
hans汉斯1 天前
基于改进交叉熵损失函数与Transformer的心电信号高风险分类研究
功能测试·深度学习·算法·yolo·目标检测·分类·transformer