IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构实验六 排序算法的实现 -> 正文阅读

[数据结构与算法]数据结构实验六 排序算法的实现

★观前提示:本篇内容为数据结构实验,代码内容经测试没有问题,但是可能会不符合每个人实验的要求,因此以下内容建议仅做思路参考。

一、实验目的

(1)掌握常见的交换排序算法的思想及适用条件;

(2)掌握常见的交换排序算法的程序实现。

(3)了解各种交换排序的排序过程及其时间复杂度的分析方法。

二、实验要求

统计成绩: 给出 n 个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个算法:

(1) 按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次;
(2) 按名次列出每个学生的姓名与分数。

★温馨提示:以下代码均为改正过的代码,皆已经过测试。

三、源码实现

1、冒泡排序和选择排序

#include<stdio.h>
#include<stdlib.h>	//定义头文件 
#include<string.h>
//定义学生类结构体 
typedef  struct
{
    char  name[10];
    int  score;
} student;
//   ==冒泡排序==
void InsertSort(student a[],int n)
{
    int i,j,flag;
    student temp;
    for(i=0; i<n-1; i++)
    {
        flag=0;
        for(j=0; j<n-i-1; j++)
        {
            if(a[j].score<a[j+1].score)//冒泡排序核心代码实现 
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
                flag=1;
            }
        }
        if(flag==0)  break;
    }
}
//	==简单选择排序==
void SelectionSort(student a[],int n)
{
    int i,j,k;
    student temp;
    for(i=0; i<n; i++)
    {
        k=i;
        for(j=i; j<n; j++)
        {
            if(a[j].score>a[k].score)  k=j; //简单选择排序核心思想实现 
        }
        if(k!=i)
        {
            temp=a[i];
            a[i]=a[k];
            a[k]=temp;
        }
    }
}
//主函数 
int main()
{
    int n,i,k,t;//定义四个整型变量 n,i,k,t 
    student *a; //定义结构体指针a 
    printf("请输入学生人数:\n");
    scanf("%d",&n);
    a=(student *)malloc(n*sizeof(student));//动态申请内存空间 
    printf("请输入学生姓名和成绩:\n");
    for(i=0; i<n; i++)
    {
        scanf("%s %d",&a[i].name,&a[i].score);//借助for循环循环输入名字和成绩 
    }
    printf("请选择您要使用的排序算法:\n(1)使用冒泡排序\n(2)使用简单选择排序\n");
    
    scanf("%d",&k);
    if(k==1)
        InsertSort(a,n);      //冒泡排序函数调用 
  
    else if(k==2)
    {
        SelectionSort(a,n);   //简单选择排序函数调用 
    }

    printf("第%d名:  %s  %d\n",1,a[0].name,a[0].score);
    t=1;
    for(i=1; i<n; i++)
    {
        if(a[i].score==a[i-1].score)        
            printf("第%d名:  %s  %d\n",t,a[i].name,a[i].score);
        
        else{
            t=i+1;
            printf("第%d名:  %s  %d\n",t,a[i].name,a[i].score);
        }
    }
    free(a);//释放掉所申请的空间 
    return 0;
}

2、快速排序

#include<stdio.h>
#include<stdlib.h>	//定义头文件 
#include<string.h>
#define MAXSIZE 101

//学生信息__结构体定义 
typedef struct
{
	char name[10];//姓名 
	int score;//成绩 
}Stu;

//顺序表__结构体定义 
typedef struct{
	Stu s[MAXSIZE]; //结构体类型数组 
	int length; //顺序表长度
}SqList;

//快速排序__插入操作	
void insertList(SqList &L)
{
	printf("请输入学生人数:\n");
	int n;
	scanf("%d",&n);
	printf("请输入%d个学生\n",n);
	for(int i=1;i<=n;i++)
	{
		printf("请输入第%d个学生的姓名和成绩\n",i);
		scanf("%s",&L.s[i].name);
		scanf("%d",&L.s[i].score);
	}
	L.length=n;
	printf("%d个元素插入成功\n",n);
}
	
//显示函数,显示姓名与成绩	
void Display(SqList L)
{
	for(int i=L.length;i>0;i--)
	{
		printf("第%d名 %s %d\n",i,L.s[i].name,L.s[i].score); 
	}
	printf("\n");
}

//快速排序算法__查找位置 
int FindPos(SqList &L,int low,int hight)
{
	int pivotkey;
	L.s[0]=L.s[low];
	pivotkey=L.s[low].score;
	while(low<hight)
	{
	while(low<hight&&L.s[hight].score>=pivotkey)
	{
		hight=hight-1;
	}
	L.s[low]=L.s[hight];
	while(low<hight&&L.s[low].score<=pivotkey){
		low=low+1;
	}
	L.s[hight]=L.s[low];
	}
	L.s[low]=L.s[0];
	return low;
}

//快速排序算法的实质就是当前分为两半,分别给这两半进行快速排序,直到low==hight 的时候
void Qsort(SqList &L,int low,int hight)
{ 
	int pos;
	if(low<hight){
		pos=FindPos(L,low,hight); //先对整体进行一次快速排序,将其分成两半
		Qsort(L,low,pos-1); //然后分别对pos 位置左边的部分在进行快速排序,位置右边的部分进行快速排序
		Qsort(L,pos+1,hight);
	}
}

//快速排序 
void QuickSort(SqList &L)
{
	Qsort(L,1,L.length);
}

//主函数 
int main()
{
	printf("-----------快速排序-------------\n");
	SqList L;
	insertList(L);
	printf("初始化后的SqList为:\n");
	Display(L);
	QuickSort(L);
	printf("排序后为:\n");
	Display(L);
	return 0;
}

四、实验总结

① 通过本次实验,了解并掌握了一些常见交换排序算法的思想还有适用条件,对排序算法有了更深的认识和了解。
② 通过多次尝试对排序算法的代码实现,理解并掌握了冒泡排序、简单选择排序、快速排序的实现方法步骤。
③ 明白了冒泡排序、简单选择排序、快速排序的代码实现逻辑,了解了各种交换排序的排序过程及时间复杂度的分析方法。

2022.5.22记录:Code_流苏(CSDN)
如有任何疑问,评论回复,看到即回,欢迎大家多多交流学习!
★以上实验内容仅供参考。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-25 11:42:15  更:2022-05-25 11:43:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 0:50:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码