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

前言

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

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

感谢愿意看到底的你们!

相关推荐
汪子熙42 分钟前
在 Word 里编写 Visual Basic 调用 DeepSeek API
后端·算法·架构
什么半岛铁盒1 小时前
Linux中INADDR_ANY详解
开发语言·c++·算法
呆呆的小鳄鱼1 小时前
如何刷新缓冲区(c++、c、linux)
linux·c语言·c++
物联网嵌入式小冉学长1 小时前
2.线性表的链式存储-链表
数据结构·链表
顾小玙1 小时前
前缀和:leetcode974--和可被K整除的子数组
数据结构·算法
猿来不是梦2 小时前
RT_Thread内核源码分析(五)——内存管理@小堆内存管理算法
stm32·单片机·算法·系统架构·rt_thread操作系统
2401_881244402 小时前
vector的用法
算法
W说编程2 小时前
算法导论第三章:数据结构艺术与高效实现
c语言·数据结构·算法
hn小菜鸡2 小时前
LeetCode 2529.正整数和负整数的最大计数
java·算法·leetcode