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

前言

到目前为止,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。

第二个细节是我写了个p[i].score<p[j].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

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

感谢愿意看到底的你们!

相关推荐
每天回答3个问题7 分钟前
LeetCodeHot100|回溯算法、46.全排列、78.子集、17.电话号码的字母组合
算法·深度优先·回溯
YL2004042610 分钟前
038翻转二叉树
数据结构·leetcode
坚果派·白晓明26 分钟前
【鸿蒙PC三方库移植适配框架解读系列】第五篇:完整流程图与角色职责
c语言·c++·华为·harmonyos·鸿蒙
Liangwei Lin1 小时前
LeetCode 287. 寻找重复数
算法·leetcode·职场和发展
聆风吟º1 小时前
【C标准库】深入理解C语言 isalpha 函数详解:判断字符是否为字母
c语言·开发语言·库函数·isalpha
OCR_133716212752 小时前
护照OCR校验位技术解析:从算法逻辑到工程落地,筑牢证件核验安全线
人工智能·算法
Hello.Reader2 小时前
算法基础(十三)——随机算法为什么有时主动引入随机性
java·数据库·算法
likerhood2 小时前
ConcurrentHashMap底层数据结构和面试常见问题
java·数据结构·面试·hashmap
老鱼说AI2 小时前
现代 LangChain 开发指南:从 LCEL 原理到企业级 RAG 与 Agent 实战
java·开发语言·人工智能·深度学习·神经网络·算法·机器学习
小许同学记录成长3 小时前
基于幅度形态与参数聚类的工作模式判别
python·算法·scikit-learn