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

这篇具有很好参考价值的文章主要介绍了实验八 排序算法的实现与分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

Function2:冒泡排序。冒泡排序是比较相邻的两个元素,这里实现的从小到大排序,所以后面的score大于前面的score时,我们就要交换位置。
实验八 排序算法的实现与分析,数据结构实验,排序算法,算法

Function3:选择排序。选定一个数据,然后比较后面的所有的数据,选择一个最小的数据,然后交换,依次选择交换下去,排序完毕。
实验八 排序算法的实现与分析,数据结构实验,排序算法,算法

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

五.实验实习结果及分析
实验八 排序算法的实现与分析,数据结构实验,排序算法,算法
实验八 排序算法的实现与分析,数据结构实验,排序算法,算法
实验八 排序算法的实现与分析,数据结构实验,排序算法,算法
实验八 排序算法的实现与分析,数据结构实验,排序算法,算法

实验成功。

六.实验遇到的问题及解决办法,实验心得体会及对此实验的意见或建议(有就写,无可不写)。
源码:文章来源地址https://www.toymoban.com/news/detail-811807.html

#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;

}

到了这里,关于实验八 排序算法的实现与分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 合肥工业大学 宣城校区 数据结构与算法实验 队列、二叉树、查找和排序

    1.实验目标 熟练掌握队列的顺序存储结构和链式存储结构。 熟练掌握队列的有关算法设计,并在循环顺序队列和链队列上实现。 根据具体给定的需求,合理设计并实现相关结构和算法。 2.实验内容和要求 循环顺序队列的实验要求 循环顺序队列结构和运算定义,算法的实现以

    2024年02月11日
    浏览(47)
  • 【数据结构】八大排序算法(内含思维导图和画图分析)

    作者主页: paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏:

    2024年02月08日
    浏览(58)
  • 【数据结构】排序算法复杂度 及 稳定性分析 【图文详解】

    前面给大家讲述了各大排序算法的原理、思路以及实现步骤、代码码源,下面让我们来对比一下各大排序之间的算法复杂度以及稳定性分析优劣,加深我们对于各排序算法的理解,帮助我们以后能更快的在具体场景下选择出最适的排序算法。 【数据结构】冒泡排序 (码源实

    2024年02月05日
    浏览(95)
  • 【数据结构与算法】JavaScript实现排序算法

    一、大O表示法 大O表示法: 在计算机中采用 粗略的度量 来描述计算机算法的 效率 ,这种方法被称为 “大O”表示法 在 数据项个数 发生改变时, 算法的效率 也会跟着改变。所以说算法A比算法B快两倍,这样的比较是 没有意义 的。 因此我们通常使用 算法的速度 随着 数据

    2024年02月02日
    浏览(50)
  • 【数据结构与算法】归并排序详解:归并排序算法,归并排序非递归实现

    归并排序是一种经典的排序算法,它使用了分治法的思想。下面是归并排序的算法思想: 递归地将数组划分成较小的子数组,直到每个子数组的长度为1或者0。 将相邻的子数组合并,形成更大的已排序的数组,直到最终得到一个完全排序的数组。 归并排序的过程可以分为三

    2024年01月22日
    浏览(67)
  • 【数据结构与算法】:非递归实现快速排序、归并排序

    🔥 个人主页 : Quitecoder 🔥 专栏 :数据结构与算法 上篇文章我们详细讲解了递归版本的快速排序,本篇我们来探究非递归实现快速排序和归并排序 快速排序的非递归实现主要依赖于栈(stack)来模拟递归过程中的函数调用栈。递归版本的快速排序通过递归调用自身来处理子

    2024年03月24日
    浏览(53)
  • 【数据结构与算法C++实现】3、排序算法

    原视频为左程云的B站教学 外层循环 :n个数需要冒n-1个泡上去,剩下的一个必然是最小的。所以外层循环执行n-1轮 内层循环 :比大小,第1个泡需要比n-1次,第2个泡,比较n-2次… 选择: 每次从待排序序列中选择 最小的一个 放在已排序序列的后一个位置 原理类似于对扑克牌

    2024年02月11日
    浏览(56)
  • 【数据结构】用Java实现七大排序算法

    目录 🌷1. 排序的概念及引用 1.1 排序的概念 1.2 衡量指标 1.2 十个排序算法  1.3 十个排序性能对比 🌷2. 冒泡排序 2.1 算法描述 2.2 动图 ⭐️代码优化 🌷3. 选择排序 3.1 算法描述 3.2 动图  3.3 代码 🌷4. 插入排序 4.1 算法描述 4.2 动图  4.3 代码 🌷5 希尔排序 5.1 描述 5.2 动图  

    2023年04月23日
    浏览(51)
  • 数据结构与算法——排序(C语言实现)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年04月09日
    浏览(55)
  • [数据结构 -- 手撕排序算法第七篇] 递归实现归并排序

    目录 1、归并的思想 2、归并排序的思想 2.1 基本思想 2.2 图解分析 3、归并排序递归版本代码实现 3.1 代码解析 3.2 注意事项 3.2.1错误划分:[begin, mid-1],[mid, end] 3.2.2 正确划分:[begin, mid], [mid+1, end] 4、归并排序的测试 5、时间复杂度、空间复杂度分析 5.1 时间复杂度 5.2 空间复杂

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包