【数据结构】——排序

🎃个人专栏:

🐬 算法设计与分析:算法设计与分析_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…

ROS学习笔记(一)- 创建工作空间和功能包

1.工作空间 工作空间(workspace)是一个存放工程开发相关文件的文件夹 • src &#xff1a;代码空间&#xff08;Source Space&#xff09; • build &#xff1a;编译空间&#xff08;Build Space&#xff09; • devel &#xff1a;开发空间&#xff08;Development Spa…

【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…

软件工程(十一)

逆向工程 定义 逆向工程 (reverse engineering)&#xff1a;指在软件生存周期中&#xff0c;将软件的某种形式描述转换成更抽象形式的活动 重构 重构 (restructuring&#xff09;&#xff1a;指在同一抽象级别上转换系统的描述形式。如把C程序转换成Java程序 设计恢复 设…

[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 通…

PC企业微信http协议逆向接口开发,发送大视频文件

产品说明 一、 hook版本&#xff1a;企业微信hook接口是指将企业微信的功能封装成dll&#xff0c;并提供简易的接口给程序调用。通过hook技术&#xff0c;可以在不修改企业微信客户端源代码的情况下&#xff0c;实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口…

js字符串分割方法

使用split()方法 这可能是最常见的字符串分割方法&#xff0c;它使用指定的分隔符将字符串拆分为子字符串&#xff0c;并返回一个数组。例如&#xff1a; const str Hello World; const arr str.split( );console.log(arr); // [Hello, World]使用substring()方法 此方法从…

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;存…

pta—说反话加强版

给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。 输入格式&#xff1a; 测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成&#xff0c;其中单词是由英文字母&#xff08;大小…

高速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…

C++学习寄录(九.多态)

1.多态基本概念 先来看这样的代码&#xff0c;我的本意是想要输出“小猫在说话”&#xff0c;但实际输出的却是“动物在说话”。这是因为地址早绑定&#xff0c;在代码编译阶段就已经确定了函数地址&#xff1b;如果想要实现既定目标&#xff0c;那么这个dospeak&#xff08;&…

练 习

写出sql语句&#xff0c;查询所有年龄大于20岁的员工2select * from employee where age>20;3写出sql语句&#xff0c;查询所有年龄大于等于22小于25的女性员工4select * from employee where age between 22 and 25 and sex女;5写出sql语句&#xff0c;统计男女员工各有多少…

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

C#WPF使用MaterialDesign 显示带遮罩的对话框

第一步定义对话框 <UserControlx:Class="TemplateDemo.Views.Edit.UCEditUser"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.m…

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

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