【数据结构】——排序

🎃个人专栏:

🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

🐳Java基础:Java基础_IT闫的博客-CSDN博客

🐋c语言:c语言_IT闫的博客-CSDN博客

🐟MySQL:数据结构_IT闫的博客-CSDN博客

🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

💎C++:C++_IT闫的博客-CSDN博客

🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

🥏python:python_IT闫的博客-CSDN博客

🐠离散数学:离散数学_IT闫的博客-CSDN博客

欢迎收看,希望对大家有用!

目录

🎯目的:

🎯内容:

🎯环境:

🎯步骤:

 💻分部解析:

💎导入头文件和命名空间

💎定义类型

💎输出排序结果函数

💎直接插入排序算法

💎折半插入排序算法

💎冒泡排序算法

💎简单选择排序的算法

💎希尔排序算法

💎快速排序算法

💎主函数

💻总代码:


🎯目的:

1、掌握排序的有关概念和特点。

2、熟练掌握直接插入排序、折半插入排序、冒泡排序、简单选择排序等算法的基本思想。

3、熟练掌握希尔排序、快速排序、堆排序、归并排序、基数排序等算法的基本思想,能够使用程序实现希尔排序、快速排序。

4、关键字序列有序与无序,对于不同的排序方法有不同的影响,通过该实验进一步加深理解。

🎯内容:

设有学生信息表{姓名,成绩}:{{aaa,87},{bbb,76},{ccc,92},{ddd,64},{eee,55},{fff,78},{ggg,100},{hhh,43}},试用不同排序算法进行排序。

🎯环境:


TC或VC++。

🎯步骤:

1、使用顺序结构存储学生信息(注意下标从1开始),并输出值。

2.将学生信息按成绩进行排序,输出各种排序算法每一趟排序的结果,观察关键字次序的变化。

(1)直接插入排序算法;

(2)折半插入排序算法;

(3)冒泡排序算法;

(4)简单选择排序的算法。

(5)希尔排序算法;

(6)快速排序算法。

 💻分部解析:

💎导入头文件和命名空间

#include <iostream>
#include "cstring"
using namespace std;

        该语句块中,使用了两个头文件,一个是 iostream,用于输入输出操作;另一个是 cstring,用于字符串操作。使用 using namespace std 命名空间,可以避免每次都写 std::

💎定义类型

#define MAXSIZE 20
typedef int KeyType;
typedef string InfoType;
typedef struct{KeyType key;//关键字项InfoType otherinfo;//其他数据项 
}RedType;
typedef struct {RedType r[MAXSIZE+1];//r[0]闲置 int length;//顺序表长度 
}SqList;

         该语句块中,定义了 MAXSIZE 宏定义常量,KeyTypeInfoType 类型分别表示关键字类型和其他数据类型,RedType 结构体表示记录,包含关键字项和其他数据项,SqList 结构体表示顺序表,包含记录数组和顺序表长度。

💎输出排序结果函数

//输出语句 
void OutPutSort(SqList L)
{for(int i=1;i<=L.length;i++){cout << " {" << L.r[i].otherinfo << "," << L.r[i].key << "}";}cout<<endl;    
}

 该语句块中,定义了 OutPutSort 函数,用于输出排序结果。

💎直接插入排序算法

//直接插入排序算法
void InsetSort(SqList L)
{//对顺序表L进行直接插入 for(int i=2;i<=L.length;i++)if(L.r[i].key<L.r[i-1].key)//"<",需要将r【i】插入到有序子表{   L.r[0]=L.r[i];//把待插入的暂存到监视哨 L.r[i]=L.r[i-1];//后移操作int j;for(j=i-2;L.r[0].key<L.r[j].key;j--)//往后寻找插入位置L.r[j+1]=L.r[j];L.r[j+1]=L.r[0];}cout<<"经过直接插入排序法排序后:"<<endl;OutPutSort(L);    
}

该语句块中,定义了 InsetSort 函数,用于对顺序表进行直接插入排序。

💎折半插入排序算法

//折半插入排序
void BInsertSort (SqList L)
{//对顺序表进行折半插入排序 int low,high,mid;for(int i=2;i<=L.length;i++){L.r[0]=L.r[i];//将待插入的记录暂存到监视哨中low=1;high=i-1;//置查找区间的初值while(low<=high){mid=(low+high)/2;if(L.r[0].key<L.r[mid].key) high=mid-1;//插入到前一个子表else low=mid+1; } for(int j=i-1;j>=high+1;j--)L.r[j+1]=L.r[j];//记录后移L.r[high+1]=L.r[0];//将r[0]插入到正确位置 }cout<<"经过折半插入排序后:"<<endl;OutPutSort(L);    
}

该语句块中,定义了 BInsertSort 函数,用于对顺序表进行折半插入排序。

💎冒泡排序算法

//冒泡排序算法
void BubbleSort(SqList L)
{RedType t;int m=L.length-1;int flag=1;//用flag值用来标记某一趟的排序是否交换 while((m>0)&&(flag==1)){flag=0;//将flag置为0,如果本趟排序没有交换,则不会执行下一趟for(int j=1;j<=m;j++){if(L.r[j].key>L.r[j+1].key){flag=1;t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t;}}m--;}cout<<"经过冒泡法排序后:"<<endl;OutPutSort(L);
}

该语句块中,定义了 BubbleSort 函数,用于对顺序表进行冒泡排序。

💎简单选择排序的算法

//简单选择排序
void SelectSort(SqList L){RedType t;for(int i=1;i<L.length;i++){//在L.r[i...L.length]中选择最小的记录 int k=i;for(int j=i+1;j<=L.length;j++){if(L.r[j].key<L.r[k].key)k=j;//k为中最小的关键字的记录}if(k!=i){t=L.r[i];L.r[i]=L.r[k];L.r[k]=t;    }}cout<<"经过简单选择排序后:"<<endl;OutPutSort(L);
}

该语句块中,定义了 SelectSort 函数,用于对顺序表进行简单选择排序。

💎希尔排序算法

//希尔排序
void ShellInsert(SqList &L,int d){for(int i=d+1;i<=L.length;i++)if(L.r[i].key<L.r[i-d].key){//需将L.r[i]插入有序增量子表中 L.r[0]=L.r[i];//暂存在r[0]中int j;for(j=i-d;j>0&&L.r[0].key<L.r[j].key;j-=d)L.r[j+d]=L.r[j];L.r[j+d]=L.r[0]; }
}   
void ShellSort(SqList L,int d[],int t){//按增量排序列d[0 ..t-1]for(int k=0;k<t;k++){ShellInsert(L,d[k]);//每一趟增量为t的希尔排序 }cout<<"经过希尔排序后:"<<endl;OutPutSort(L);
} 

该语句块中,定义了 ShellInsert 函数和 ShellSort 函数,用于对顺序表进行希尔排序。

💎快速排序算法

//快速排序int Partition(SqList &L,int low ,int high){L.r[0]=L.r[low];//用子表的第一个作为枢轴 int pivotkey=L.r[low].key;//将其关键字保存在pivotkey里while(low<high)//从表的两端交替向中间查找 {while(low<high&&L.r[high].key>=pivotkey)--high;L.r[low]=L.r[high];//将比枢轴记录小的记录移到低位while(low<high&&L.r[low].key<=pivotkey)++low;L.r[high]=L.r[low];// 将比枢轴记录大的记录移到高位}L.r[low]=L.r[0];// 枢轴记录到位return low;//返回枢纽位置 }void QSort(SqList &L,int low,int high){if(low<high){int pivotloc=Partition(L,low ,high);//将L.r一分为二,pivotloc是枢轴位置 QSort(L,low,pivotloc-1);//对左子表递归排序QSort(L,pivotloc+1,high);//对右子表递归排序 }}void QuickSort(SqList L)
{//对顺序表进行快速排序 QSort(L,1,L.length);cout<<"经过快速排序后:"<<endl;OutPutSort(L);
}

该语句块中,定义了 Partition 函数和 QSort 函数和 QuickSort 函数,用于对顺序表进行快速排序。

💎主函数

int main() {// 初始化学生信息表SqList L;L.r[1].key = 87; L.r[1].otherinfo = "aaa";L.r[2].key = 76; L.r[2].otherinfo = "bbb";L.r[3].key = 92; L.r[3].otherinfo = "ccc";L.r[4].key = 64; L.r[4].otherinfo = "ddd";L.r[5].key = 55; L.r[5].otherinfo = "eee";L.r[6].key = 78; L.r[6].otherinfo = "fff";L.r[7].key = 100; L.r[7].otherinfo = "ggg";L.r[8].key = 43; L.r[8].otherinfo = "hhh";L.length = 8;cout << "原始学生信息表:";OutPutSort(L);// 不同排序算法进行排序InsetSort(L);BInsertSort (L);BubbleSort(L);SelectSort(L);int d[] = {5, 3, 1}; // 增量数组dShellSort(L, d, 3);QuickSort(L);return 0;
}

对定义函数进行调用。

💻总代码:

#include <iostream>
#include "cstring"
using namespace std;#define MAXSIZE 20
typedef int KeyType;
typedef string InfoType;
typedef struct{KeyType key;//关键字项InfoType otherinfo;//其他数据项 
}RedType;
typedef struct {RedType r[MAXSIZE+1];//r[0]闲置 int length;//顺序表长度 
}SqList;//输出语句 
void OutPutSort(SqList L)
{for(int i=1;i<=L.length;i++){cout << " {" << L.r[i].otherinfo << "," << L.r[i].key << "}";}cout<<endl;	
}//直接插入排序算法
void InsetSort(SqList L)
{//对顺序表L进行直接插入 for(int i=2;i<=L.length;i++)if(L.r[i].key<L.r[i-1].key)//"<",需要将r【i】插入到有序子表{	L.r[0]=L.r[i];//把待插入的暂存到监视哨 L.r[i]=L.r[i-1];//后移操作int j;for(j=i-2;L.r[0].key<L.r[j].key;j--)//往后寻找插入位置L.r[j+1]=L.r[j];L.r[j+1]=L.r[0];}cout<<"经过直接插入排序法排序后:"<<endl;OutPutSort(L);	
}//折半插入排序
void BInsertSort (SqList L)
{//对顺序表进行折半插入排序 int low,high,mid;for(int i=2;i<=L.length;i++){L.r[0]=L.r[i];//将待插入的记录暂存到监视哨中low=1;high=i-1;//置查找区间的初值while(low<=high){mid=(low+high)/2;if(L.r[0].key<L.r[mid].key) high=mid-1;//插入到前一个子表else low=mid+1; } for(int j=i-1;j>=high+1;j--)L.r[j+1]=L.r[j];//记录后移L.r[high+1]=L.r[0];//将r[0]插入到正确位置 }cout<<"经过折半插入排序后:"<<endl;OutPutSort(L);	
}//冒泡排序算法
void BubbleSort(SqList L)
{RedType t;int m=L.length-1;int flag=1;//用flag值用来标记某一趟的排序是否交换 while((m>0)&&(flag==1)){flag=0;//将flag置为0,如果本趟排序没有交换,则不会执行下一趟for(int j=1;j<=m;j++){if(L.r[j].key>L.r[j+1].key){flag=1;t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t;}}m--;}cout<<"经过冒泡法排序后:"<<endl;OutPutSort(L);
}//简单选择排序
void SelectSort(SqList L){RedType t;for(int i=1;i<L.length;i++){//在L.r[i...L.length]中选择最小的记录 int k=i;for(int j=i+1;j<=L.length;j++){if(L.r[j].key<L.r[k].key)k=j;//k为中最小的关键字的记录}if(k!=i){t=L.r[i];L.r[i]=L.r[k];L.r[k]=t;	}}cout<<"经过简单选择排序后:"<<endl;OutPutSort(L);
}//希尔排序
void ShellInsert(SqList &L,int d){for(int i=d+1;i<=L.length;i++)if(L.r[i].key<L.r[i-d].key){//需将L.r[i]插入有序增量子表中 L.r[0]=L.r[i];//暂存在r[0]中int j;for(j=i-d;j>0&&L.r[0].key<L.r[j].key;j-=d)L.r[j+d]=L.r[j];L.r[j+d]=L.r[0]; }
}	
void ShellSort(SqList L,int d[],int t){//按增量排序列d[0 ..t-1]for(int k=0;k<t;k++){ShellInsert(L,d[k]);//每一趟增量为t的希尔排序 }cout<<"经过希尔排序后:"<<endl;OutPutSort(L);
} //快速排序int Partition(SqList &L,int low ,int high){L.r[0]=L.r[low];//用子表的第一个作为枢轴 int pivotkey=L.r[low].key;//将其关键字保存在pivotkey里while(low<high)//从表的两端交替向中间查找 {while(low<high&&L.r[high].key>=pivotkey)--high;L.r[low]=L.r[high];//将比枢轴记录小的记录移到低位while(low<high&&L.r[low].key<=pivotkey)++low;L.r[high]=L.r[low];// 将比枢轴记录大的记录移到高位}L.r[low]=L.r[0];// 枢轴记录到位return low;//返回枢纽位置 }void QSort(SqList &L,int low,int high){if(low<high){int pivotloc=Partition(L,low ,high);//将L.r一分为二,pivotloc是枢纽位置 QSort(L,low,pivotloc-1);//对左子表递归排序QSort(L,pivotloc+1,high);//对右子表递归排序 }}void QuickSort(SqList L)
{//对顺序表进行快速排序 QSort(L,1,L.length);cout<<"经过快速排序后:"<<endl;OutPutSort(L);
}int main() {// 初始化学生信息表SqList L;L.r[1].key = 87; L.r[1].otherinfo = "aaa";L.r[2].key = 76; L.r[2].otherinfo = "bbb";L.r[3].key = 92; L.r[3].otherinfo = "ccc";L.r[4].key = 64; L.r[4].otherinfo = "ddd";L.r[5].key = 55; L.r[5].otherinfo = "eee";L.r[6].key = 78; L.r[6].otherinfo = "fff";L.r[7].key = 100; L.r[7].otherinfo = "ggg";L.r[8].key = 43; L.r[8].otherinfo = "hhh";L.length = 8;cout << "原始学生信息表:";OutPutSort(L);// 不同排序算法进行排序InsetSort(L);BInsertSort (L);BubbleSort(L);SelectSort(L);int d[] = {5, 3, 1}; // 增量数组dShellSort(L, d, 3);QuickSort(L);return 0;
}

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

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

相关文章

bugku题解记录2

文章目录 哥哥的秘密黄道十二官where is flag一段新闻 哥哥的秘密 给出了一个qq&#xff0c;那就去看看呗 hint里面说 收集空间信息——相册——收集微博信息——相册——解题——相册——提交flag 那看看空间先 盲文&#xff1a; hint&#xff1a;密码时地人 旗帜存在相册里…

【精选】ATKCK红队评估实战靶场一 超详细过程思路

一、环境搭建 1.红日靶场下载&#xff1a; 靶场下载地址&#xff1a; https://pan.baidu.com/s/1nC6V8e_EuKfaLb2IuEbe7w&shflsharepset 提取码&#xff1a;n1u22.内外网IP搭建 Windows 7 x64Windows Server 2008Win2K3 Metasploitablekali内网IP&#xff1a;192.168.52…

【LeetCode:1657. 确定两个字符串是否接近 | 计数 + 阅读理解】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Ubuntu使用Nginx部署前端项目——记录

安装nginx 依次执行以下两条命令进行安装&#xff1a; sudo apt-get update sudo apt-get install nginx通过查看版本号查看是否安装成功&#xff1a; nginx -v补充卸载操作&#xff1a; sudo apt-get remove nginx nginx-common sudo apt-get purge nginx nginx-common su…

[ffmpeg] aac 音频编码

aac 介绍 aac 简单说就是音频的一种压缩编码器&#xff0c;相同音质下压缩比 mp3好&#xff0c;目前比较常用。 aac 编码支持的格式 aac 支持的 sample_fmts: 8 aac 支持的 samplerates: 96000 88200 64000 48000 44100 32000 24000 22050 16000 12000 11025 8000 7350 通…

Pycharm中使用matplotlib绘制动态图形

Pycharm中使用matplotlib绘制动态图形 最终效果 最近用pycharm学习D2L时发现官方在jupyter notebook交互式环境中能动态绘制图形&#xff0c;但是在pycharm脚本环境中只会在最终 plt.show() 后输出一张静态图像。于是有了下面这段自己折腾了一下午的代码&#xff0c;用来在pych…

unity学习笔记12

一、物理系统 如何让一个球体受到重力的影响&#xff1f; 只要给物体添加刚体组件&#xff08;Rigidbody&#xff09;&#xff0c;就可以使其受到重力影响 1.刚体&#xff08;Rigidbody&#xff09;&#xff1a; 刚体是一个组件&#xff0c;用于使游戏对象受到物理引擎的控制。…

Leetcode2336. 无限集中的最小数字

Every day a Leetcode 题目来源&#xff1a;2336. 无限集中的最小数字 解法1&#xff1a;集合 由于一开始类中包含所有正整数&#xff0c;并且操作要么添加任意的正整数&#xff0c;要么删除最小的正整数&#xff0c;因此我们可以期望&#xff0c;在任意时刻&#xff0c;存…

高速PCB设计中的射频分析与处理方法

射频&#xff08;Radio Frequency&#xff0c;RF&#xff09;电路在现代电子领域中扮演着至关重要的角色&#xff0c;涵盖了广泛的应用&#xff0c;从通信系统到雷达和射频识别&#xff08;RFID&#xff09;等。在高速PCB设计中&#xff0c;射频电路的分析和处理是一项具有挑战…

4152A/E/F 调制域分析仪(0.125Hz~4GHz/26.5GHz/40GHz)

4152A/E/F 调制域分析仪 频率范围覆盖&#xff1a;0.125Hz&#xff5e;40GHz 能够精确表征信号频率随时间动态变化规律 01 产品综述 4152系列调制域分析仪能够精确表征信号频率随时间动态变化规律&#xff0c;最大监测带宽36GHz&#xff0c;最短每隔100ns无隙监测&#xff…

html/css中用float实现的盒子案例

运行效果&#xff1a; 代码部分&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <title>无标题文档</title> <style type"text/css">.father{width:300px; height:400px; background:gray;…

svn合并冲突时每个选项的含义

合并冲突时每个选项的含义 - 这个图片是 TortoiseSVN&#xff08;一个Subversion&#xff08;SVN&#xff09;客户端&#xff09;的合并冲突解决对话框。当你尝试合并两个版本的文件并且出现差异时&#xff0c;你需要解决这些差异。这个对话框提供了几个选项来处理合并冲突&…

LeetCode(39)赎金信【哈希表】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 赎金信 1.题目 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字…

Mysql DDL语句建表及空字符串查询出0问题

DDL语句建表 语法&#xff1a; create table 指定要建立库的库名.新建表名 &#xff08;... 新建表的字段以及类型等 ...&#xff09;comment 表的作用注释 charset 表编译格式 row_format DYNAMIC create table dev_dxtiot.sys_url_permission (id integer …

hyper-V操作虚拟机ubuntu 22.03

安装hyper-V 点击卸载程序 都勾选上即可 新建虚拟机&#xff0c;选择镜像文件 选择第一代即可 设置内存 配置网络 双击 启动安装虚拟机 输入用户名 zenglg 密码&#xff1a;LuoShuwen123456 按照enter键选中openssh安装 安装中 安装完成 选择重启 输入用户名、密码

教育企业CRM选择技巧

教育行业的发展一波三折&#xff0c;要想在激烈的赛道脱颖而出&#xff0c;就需要有一套有效的CRM系统&#xff0c;来帮助教育机构提升招生效率、增加学员留存、提高教学质量。下面说说&#xff0c;教育企业选择CRM系统要具备的四大功能。 1、招生管理功能 教育机构的首要目标…

springboot+mysql实现就业信息管理系统

springbootmysql实现的就业信息管理系统,有普通用户和管理员两种角色,演示地址:yanshi.ym4j.com:8091 普通用户账号&#xff1a;test 密码&#xff1a;123456管理员账号&#xff1a;admin 密码&#xff1a;123456 共包含就业信息管理、就业统计、用户管理等功能。 登录 就业信…

企业软件的分类|app小程序网站定制开发

企业软件的分类|app小程序网站定制开发 企业软件是指为满足企业管理和运营需求而设计和开发的一类软件&#xff0c;它通常用于支持企业的各项业务活动和流程。根据其功能和应用领域的不同&#xff0c;可以将企业软件分为以下几类。 1. 企业资源计划&#xff08;ERP&#xff09…

飞书全新版本搭载AI智能伙伴,支持用户自选底层大模型!

原创 | 文 BFT机器人 近日&#xff0c;字节跳动旗下飞书正式发布“飞书智能伙伴”系列AI产品。此次新产品有专属、易协作、有知识、有记忆、更主动等特点。除此之外&#xff0c;“飞书智能伙伴”作为一个开放的AI服务框架&#xff0c;各企业可根据业务场景自主选择适合的底层大…

13:kotlin类和对象 -- 属性(Properties)

定义属性 类属性可使用var和val定义 class Address {var name: String "Holmes, Sherlock"var street: String "Baker"var city: String "London"var state: String? nullvar zip: String "123456" }属性使用 fun copyAddres…