【数据结构】——排序

🎃个人专栏:

🐬 算法设计与分析:算法设计与分析_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.rhkb.cn/news/205927.html

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

相关文章

【网络奇遇之旅】:那年我与计算机网络的初相遇

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; 计算机网络 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 一. 前言二. 计算机网络的定义三. 计算机网络的功能3.1 资源共享3.2 通信功能3.3 其他功能 四. 计算机网络…

Mysql 递归查询子类Id的所有父类Id

文章目录 问题描述先看结果表结构展示实现递归查询集合查询结果修复数据 问题描述 最近开发过程中遇到一个问题,每次添加代理关系都要去递归查询一下它在不在这个代理关系树上.很麻烦也很浪费资源.想着把代理关系的父类全部存起来 先看结果 表结构展示 表名(t_agent_user_rela…

如何把ipa文件(iOS安装包)安装到iPhone手机上? 附方法汇总

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 技术细节 目录 Appuploader 常见错误及解决方法 苹果APP安装包ipa如何安装在手机上&#xff1f;很多人不知道怎么把ipa文件安装到手机上&#xff0c;这里就整理了苹果APP安装到iOS设备上的方式&#xff0c;仅供参考 苹…

Linux基础指令

1.ls指令 【语法】ls 目录/普通文件 对于目录&#xff0c;列出目录中的所有文件对于普通文件&#xff0c;列出文件的基本属性 选项&#xff1a; -l 详细列出文件的属性-a 列出当前目录下的文件和隐藏文件-i 显示文件的索引信息-R 以递归的方式显示目录下的文件 1.1 [ls -l…

sql注入靶场

第一关&#xff1a; 输入&#xff1a;http://127.0.0.1/sqli-labs-master/Less-1/?id1 http://127.0.0.1/sqli-labs-master/Less-1/?id1%27 http://127.0.0.1/sqli-labs-master/Less-1/?id1%27-- 使用--来闭合单引号&#xff0c;证明此处存在字符型的SQL注入。 使用order …

《程序员考公指南》:零基础到上岸的完整攻略 | 开源日报 No.82

mastodon/mastodon Stars: 44.2k License: AGPL-3.0 Mastodon 是一个免费、开源的社交网络服务器&#xff0c;基于 ActivityPub。用户可以在 Mastodon 上关注朋友并发现新朋友&#xff0c;并且可以发布链接、图片、文字和视频等内容。所有的 Mastodon 服务器都能互操作成为联邦…

第五届全国高校计算机能力挑战赛-程序设计挑战赛(C语言模拟题)

1、已有定义“int a[10]{1,2},i0;”&#xff0c;下面语句中与“ a[i]a[i1],i;”等价的是()。 A. a[i]a[i1]; B. a[i]a[i]; C. a[i]a[i1]; D. i,a[i-1]a[i]; 2、两次运行下面的程序&#xff0c;如果从键盘上分别输入6和4&#xff0c;则输出结果是(&#xff09;。 A. 7和5 …

谁可以从使用 Amazon Lightsail 进行 VPS 托管中受益?

文章作者&#xff1a;Libai 介绍 在当今数字化的环境中&#xff0c;拥有可靠和高效的托管解决方案对于企业和个人来说至关重要。由于其灵活性、可扩展性和成本效益&#xff0c;虚拟专用服务器&#xff08;VPS&#xff09;托管已经在市场上获得了巨大的流行。Amazon Lightsail …

ORA-00837: Specified value of MEMORY_TARGET greater than MEMORY_MAX_TARGET

有个11g rac环境&#xff0c;停电维护后&#xff0c;orcl1正常启动了&#xff0c;orcl2启动报错如下 SQL*Plus: Release 11.2.0.4.0 Production on Wed Nov 29 14:04:21 2023 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SYS…

相同的树 单值二叉树 二叉树的最大深度

文章目录 相同的树单值二叉树二叉树的最大深度 相同的树 力扣&#xff1a;100相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 …

vue3 keep-alive页面切换报错:parentComponent.ctx.deactivate is not a function

问题&#xff1a; <router-view v-slot"{ Component }"><keep-alive ><component :is"Component" v-if"$route.meta.keepAlive" /></keep-alive><component :is"Component" v-if"!$route.meta.keepA…

27.0/多态/对象向上转型/向下转型/抽象类/抽象方法。

目录 27.1为什么使用多态? 27.1.2什么是多态 27.1.3对象多态 27.1.4多态的使用前提 27.2 向上转型 27.3向下转型 (面试题) 27.4抽象类和抽象方法 特点(面试题): 27.1为什么使用多态? 需求1&#xff1a;动物园让我们实现一个功能&#xff1a; 创建一个狗类 &#xff0c;狗…

亚马逊云科技向量数据库助力生成式AI成功落地实践探秘(一) ​

随着大语言模型效果明显提升&#xff0c;其相关的应用不断涌现呈现出越来越火爆的趋势。其中一种比较被广泛关注的技术路线是大语言模型&#xff08;LLM&#xff09;知识召回&#xff08;Knowledge Retrieval&#xff09;的方式&#xff0c;在私域知识问答方面可以很好的弥补通…

5种主流API网关技术选型,yyds!

API网关是微服务项目的重要组成部分&#xff0c;今天来聊聊API网关的技术选型&#xff0c;有理论&#xff0c;有实战。 不 BB&#xff0c;上文章目录&#xff1a; 1 API网关基础 1.1 什么是API网关 API网关是一个服务器&#xff0c;是系统的唯一入口。 从面向对象设计的角度…

Echarts 大屏注册自定义地图解析文件流报错以及坐标显示数值和地图填充以及dataV轮播数据不显示问题解决

效果图: 1、第一种方式 后台接口获取到SVG图片的文件流,postman能够正确解析出文件流,前端调用api时需要设置返回的响应格式为image/svg+xml格式,否则解析失败 拿到文件流后是这样的 <?xml version="1.0" encoding="utf-8"?> <!-- Generato…

连接备份1128

深度学习—分类识别篇&#xff1a;http://tr.daheng-imaging.com/watch/1050636http://tr.daheng-imaging.com/watch/1050636 深度学习—目标检测篇&#xff1a;http://tr.daheng-imaging.com/watch/1101141http://tr.daheng-imaging.com/watch/1101141 深度学习—缺陷分割篇&a…

STM32通讯设计

STM32通讯设计 通讯流程STM32程序 通讯流程 1.使用HT2202芯片配置为主机接收&#xff08;轮询模式&#xff09;。 2.将STM32芯片配置为从机发送&#xff0c;中断模式下发送固定数据。 3.如果HT2202芯片能够收到STM32发送的数据则通讯成功&#xff0c;否则通讯失败。 STM32程序…

mac 聚焦搜索不显示

我是连搜索框都不显示&#xff0c;不是搜索结果显示异常 点右上角的搜索按钮都毫无反应 我检查过快捷键之类的设置&#xff0c;都正常&#xff0c;最后是通过删除文件解决的 cd ~/Library/Preferences/ rm com.apple.Spotlight.plist 重启 mac 参考 Spotlight Search Not W…

蓝桥杯第一天-----时间显示

文章目录 前言一、题目描述二、测试用例三、题目分析四、具体代码实现总结 前言 本章中将相信介绍蓝桥杯中关于时间显示的题目。 链接&#xff1a;https://www.lanqiao.cn/problems/1452/learning/ 一、题目描述 二、测试用例 三、题目分析 1.输入的时间为毫秒&#xff0c;毫…

【LeetCode】每日一题 2023_11_30 确定两个字符串是否接近 (数组、排序、哈希/位运算、脑筋急转弯)

文章目录 刷题前唠嗑题目&#xff1a;确定两个字符串是否接近题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 刷完今天&#xff0c;我的每日一题就坚持一个月啦&#xff0c;月度勋章要到手啦 今早很尴尬&#xff0c;…