实验八 排序算法的实现与分析

news2025/6/10 0:30:26

实验八 排序算法的实现与分析
一.实验目的
1.掌握常用的排序方法,并掌握用高级语言实现排序算法的方法;
2.深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用;
3.了解各种方法的排序过程及其时间复杂度的分析方法。
二、实验内容
统计成绩:给出 n 个学生的考试成绩表,每条信息由姓名和分数组成,试设
计一个算法:
1.按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同
一名次;
2.按名次列出每个学生的姓名与分数。

三、实验实习设备及开发环境
Visual studio 2022
四.实验实习过程步骤(注意是主要关键步骤,不是所有步骤,适当文字+截图说明)
Function1:插入排序。这里利用的带有哨兵的插入排序(因为我们在初始化的时候就已经把数组的开始设置成了下标为1开始,所以哨兵就可以放到下标为0的位置),我们从第二个位置开始,依次比较前一个(前面的序列我们默认为已经排序好的),首先我们将处于i位置的放在哨兵位置,就是下标为0的位置,然后,我们从后面依次比较,同时将比较的结果往后移动一位,当前面某个位置分数小于我们哨兵的时候,我们就可以插入了。
在这里插入图片描述

Function2:冒泡排序。冒泡排序是比较相邻的两个元素,这里实现的从小到大排序,所以后面的score大于前面的score时,我们就要交换位置。
在这里插入图片描述

Function3:选择排序。选定一个数据,然后比较后面的所有的数据,选择一个最小的数据,然后交换,依次选择交换下去,排序完毕。
在这里插入图片描述

Function4:希尔排序。先分组,后排序。分组的gap是按照长度除以2依次分组,然后分组后进行直接插入排序。
在这里插入图片描述

五.实验实习结果及分析
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验成功。

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 10

typedef struct student
{
	char name[MAX];
	float score;
}Student;

int Initstudent(Student* s)
{
	printf("请输入学生信息。\n");
	char name[MAX];
	float score;
	int number = 0;
	while (scanf(" %s %f",name ,&score ) && strcmp(name, "0") &&  score!= 0)
	{
		number++;
		strcpy(s[number].name, name);
		s[number].score = score;
	}
	return number;
}

void insertsort(Student* s,int number)
{
	int i;
	int j;
	for (i = 2; i <= number; i++)
	{
		if (s[i].score < s[i - 1].score)
		{
			s[0].score = s[i].score;
			strcpy(s[0].name, s[i].name);
			for (j = i - 1;s[j].score>s[0].score ; j--)
			{
				s[j + 1].score = s[j].score;
				strcpy(s[j + 1].name, s[j].name);
			}
			s[j + 1].score = s[0].score;
			strcpy(s[j + 1].name, s[0].name);
		}
	}

}

void bubblesort(Student* s, int number)
{
	int i, j;
	int temp_score;
	char temp_name[MAX];
	for (i =2;i<=number;i++ )
	{
		for (j = 1; j<=number-1;j++)
		{
			if (s[j + 1].score < s[j].score)
			{
				temp_score = s[j + 1].score;
				s[j + 1].score = s[j].score;
				s[j].score = temp_score;
				strcpy(temp_name, s[j + 1].name);
				strcpy(s[j + 1].name, s[j].name);
				strcpy(s[j].name, temp_name);
			}
		}
	}
}

void printresult(Student* s, int number)
{
	int i;
	int level = 0;
	for (i = number; i >= 1; i--)
	{
		if (s[i].score == s[i + 1].score && i != number) 
		{
			printf("%d %s %.2f\n", level, s[i].name, s[i].score);
		}
		else
		{
			level++;
			printf("%d %s %.2f\n", level, s[i].name, s[i].score);
		}
	}
}

void swap(Student* s1, Student* s2)
{
	Student temp;
	temp = *s1;
	*s1 = *s2;
	*s2 = temp;
}

void choosesort(Student* s, int number)
{
	int i;
	float min;
	int min_key;
	int j;
	for (i = 1; i < number; i++)
	{
		min = s[i].score;
		for (j = i + 1; j <= number; j++)
		{
			if (s[j].score < min)
			{
				min = s[j].score;
				min_key = j;
			}
		}
		swap(&s[i], &s[min_key]);
	}
}

void shell(Student* s, int gap, int number)
{
	int i;
	for (i = gap; i <= number; i++)
	{
		Student tmp = s[i];
		int j = i - gap;
		for (j = i - gap; j >= 1; j = j - gap)
		{
			if (s[j].score > tmp.score)
			{
				s[j + gap] = s[j];
			}
			else
			{
				break;
			}
		}
		s[j + gap] = tmp;
	}
}

void shellsort(Student* s, int number)
{
	int lenth = number;
	while (lenth >= 1)
	{
		lenth = lenth / 2;
		shell(s, lenth,number);
	}
}


int main()
{
	Student s[MAX];
	int student_number;
	student_number = Initstudent(s);
	int choice;
	printf("请选择排序类型:1.插入排序,2.冒泡排序,3.选择排序,4.希尔排序\n");
	scanf("%d", &choice);
	if (choice == 1)
	{
		insertsort(s, student_number);
	}
	else if (choice == 2)
	{
		bubblesort(s, student_number);
		
	}
	else if (choice == 3)
	{
		choosesort(s, student_number);
	}
	else if (choice == 4)
	{
		shellsort(s, student_number);
	}
	else
	{
		printf("输入不正确\n");
		return 0;
	}
	printresult(s, student_number);
	return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10- OpenCV:基本阈值操作(Threshold)

目录 1、图像阈值 2、阈值类型 3、代码演示 1、图像阈值 &#xff08;1&#xff09;图像阈值&#xff08;threshold&#xff09;含义&#xff1a;是将图像中的像素值划分为不同类别的一种处理方法。通过设定一个特定的阈值&#xff0c;将像素值与阈值进行比较&#xff0c;根…

单片机I/O口驱动MOS管

自记录&#xff1a; 看完本章&#xff0c;串起来看&#xff0c;看mos驱动电路这篇&#xff1a;MOS管驱动电流计算以及分立器件驱动电路-CSDN博客 使用单片机做一个PLC,输出可如下两种情况&#xff1a; 单片机I/O口驱动&#xff0c;为什么一般都选用三极管而不是MOS管&#xf…

【RTOS】快速体验FreeRTOS所有常用API(1)工程创建

目录 一、工程创建1.1 新建工程1.2 配置RCC1.3 配置SYS1.4 配置外设1&#xff09;配置 LED PC132&#xff09;配置 串口 UART13&#xff09;配置 OLED I2C1 1.5 配置FreeRTOS1.6 工程设置1.7 生成代码1.8 keil设置下载&复位1.9 添加用户代码 快速体验FreeRTOS所有常用API&a…

第36期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

什么是用户态和内核态?用户态和内核态是如何切换的?

一、什么是用户态和内核态&#xff1f; 1.1、概述 用户态和内核态是操作系统的两种运行状态。 内核态&#xff1a;处于内核态的 CPU 可以访问任意的数据&#xff0c;包括外围设备&#xff0c;比如网卡、硬盘等&#xff0c;处于内核态的 CPU 可以从一个程序切换到另外一个程序…

QGroundControl Qt安卓环境搭建及编译出现的问题

记录Qt 5.15.2搭建安卓环境出现的各种问题。 zipalign tool not found: D:/JavaAndroid/Android/sdk/build-tools//zipalign.exe&#xff1f; 答&#xff1a;需要将DANDROID_PLATFORM升级到已下载的版本. bin/llvm-readobj.exe: error: unknown argument ‘–libs’ 答&…

ES搜索的安装以及常用的增删改查操作(已经写好json文件,可以直接使用)

1.es的下载 https://www.elastic.co/cn/downloads/past-releases 2.elasticsearch安装及配置&#xff0c;遇到9200访问不了以及中文乱码&#xff0c;能访问了却要账户密码等问题 Elasticsearch启动后访问9200失败_http://localhost:9200无返回值-CSDN博客 3.开启es服务&#x…

JS-var 、let 、 const使用介绍

变量声明介绍 在我们日常开发用&#xff0c;变量声明有三个 var、 let 和 const&#xff0c;我们应该用那个呢&#xff1f; 首先var 先排除&#xff0c;老派写法&#xff0c;问题很多&#xff0c;可以淘汰掉…let or const ?建议&#xff1a; const 优先&#xff0c;尽量使…

uniapp中uview组件库Toast 消息提示 的使用方法

目录 #基本使用 #配置toast主题 #toast结束跳转URL #API #Props #Params #Methods 此组件表现形式类似uni的uni.showToastAPI&#xff0c;但也有不同的地方&#xff0c;具体表现在&#xff1a; uView的toast有5种主题可选可以配置toast结束后&#xff0c;跳转相应URL目…

MetaGPT入门(一)

本文在Win11操作系统下进行&#xff0c;工具pycharm 一、环境准备 1.建议使用conda虚拟环境 安装anaconda参考&#xff1a;Windows10下Anaconda的安装_windows anaconda 路径-CSDN博客 打开Anaconda Powershell Prompt命令窗口&#xff0c;输入下面命令&#xff0c;创建3.1…

Qt 信号和槽机制

一. 简介 在Qt中使用信号和槽机制来完成对象之间的协同操作。简单来说&#xff0c;信号和槽都是函数&#xff0c;比如按下窗口上的一个按钮后想要弹出一个对话框&#xff0c;那么就可以将这个按钮的单击信号和我们定义的槽关联起来&#xff0c;在这个槽中可以创建一个对话框&am…

AI对决:ChatGPT与文心一言的比较

文章目录 引言ChatGPT与文心一言的比较Chatgpt的看法文心一言的看法Copilot的观点chatgpt4.0的回答 模型的自我评价自我评价 ChatGPT的优势在这里插入图片描述 文心一言的优势AI技术发展趋势总结 引言 在过去的几年里&#xff0c;人工智能&#xff08;AI&#xff09;技术取得了…

使用nginx搭建网页

一、基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 具体配置 #下载nginx [rootoula1 ~]# yum install nginx -y #关闭防火墙 1、[rootoula1 ~]# systemctl stop firewalld 2、[rootoula1 ~]# setenforce 0#修改配置文件 [ro…

十一、HTML 图像

1、插入图像 本例演示如何在网页中显示图像。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>插入图像</title> </head><body><p>一个图像:<img src"smiley.gif" alt"Smiley …

❤ Uniapp使用四( 高阶使用配置和各种实现篇)

❤ Uniapp使用四( 复杂配置和各种实现篇) uniapp引入 vant 引入方式 1、下载vant源码 方式一&#xff1a;从 Vant 官网首页进入 GitHub下载对应版本的压缩包,将文件解压后备用,确保下载的压缩包里有dist 文件夹 2、创建 uniapp 项目,在根目录下新建 一个文件夹wxcomponents …

解决哈希冲突的几种方法

什么是hash冲突 哈希函数是一个映像&#xff0c;把任意长度的输入&#xff0c;通过Hash算法变换成固定长度的输出&#xff0c;这个输出就是Hash值&#xff1b; 当两个不同的输入&#xff0c;产生了同一个输出值即为哈希冲突 解决方式 开放定址法 开放寻址法的核心思想是&am…

OpenCV-25sobel算子(索贝尔算子)

前面所提到的滤波都是用于降噪的&#xff0c;去掉噪声&#xff0c;而算子是用来找边界&#xff0c;来识别图像的边缘。 一、概念 边缘是像素值发生跃迁的值&#xff0c;是图像的显著特点之一&#xff0c;在图像特征提取&#xff0c;对象检测&#xff0c;模式识别等方面都有重…

c语言-库函数strstr()、strtok()、strerror()介绍

文章目录 前言一、库函数strstr()1.1 strstr()介绍1.2 strstr()模拟实现 二、库函数strtok()2.1 strtok()介绍 三、库函数strerror()3.1 strerror()介绍 总结 前言 本篇文章介绍c语言库函数strstr()、strtok()、strerror()的使用。 一、库函数strstr() 1.1 strstr()介绍 str…

【Emgu CV教程】5.1、几何变换之平移

图像的几何变换对于图像处理来说&#xff0c;也是最基础的那一档次&#xff0c;包括平移、旋转、缩放、透视变换等等&#xff0c;也就是对图像整理形状的改变&#xff0c;用到的函数都比较简单&#xff0c;理解起来也很容易。但是为了凑字数&#xff0c;还是一个函数一个函数的…

java多线程面试(三)

1.Exchanger 了解吗 Exchanger&#xff08;交换者&#xff09;是用于一个线程之间的协调工具类&#xff0c;Exchannge用于进行线程之间的数据交换&#xff0c;它提供一个同步点&#xff0c;两个线程可以交换彼此的数据。 假如两个线程有一个没有执行exchange()方法&#xff0c…