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

前言

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

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

感谢愿意看到底的你们!

相关推荐
Wang's Blog26 分钟前
数据结构与算法之数组: LeetCode 541. 反转字符串 II (Ts版)
算法·leetcode
嵌入式学习菌1 小时前
常见的排序算法:插入排序、选择排序、冒泡排序、快速排序
java·算法·排序算法
在成都搬砖的鸭鸭2 小时前
【LeetCode】时间复杂度和空间复杂度
算法·leetcode·golang·排序算法
Mercury_Lc2 小时前
【力扣 - 简单题】88. 合并两个有序数组
数据结构·算法·leetcode·acm
qy发大财2 小时前
全排列(力扣46)
算法·leetcode·职场和发展
欧了1112 小时前
动态规划LeetCode-1049.最后一块石头的重量Ⅱ
c语言·算法·leetcode·动态规划·01背包
tamak2 小时前
c/c++蓝桥杯经典编程题100道(21)背包问题
c语言·c++·蓝桥杯
冠位观测者2 小时前
【Leetcode 每日一题】1760. 袋子里最少数目的球
数据结构·算法·leetcode
菠菠萝宝2 小时前
【代码随想录】第八章-贪心算法
算法·贪心算法·排序算法·合并区间·加油站·找零·监控二叉树
IT古董2 小时前
【机器学习】数学知识:拉格朗日对偶(Lagrange Duality)
算法·机器学习·支持向量机