排序算法(选择排序、直接插入排序、冒泡排序、二路归并排序)(C语言版)

对数组进行排序,主要演示选择排序、直接排序、冒泡排序、二路归并排序算法,附上代码演示

一、编写好各类排序方法的函数
(1) s_sort(int e[],int n):选择排序。
(2)si_sort(int e[],int n):直接插人排序。
(3)sb_sort(int e[],int n):冒泡排序。
(4)merge(int e[],intn);二路归并排序。

二、调用上述函数实现下列操作:
(1)给定数组 E[N]={213,111,222,77,400,300,987,1024,632,555};
(2)调用选择排序函数进行排序;
(3)调用直接插人函数进行排序;
(4)调用冒泡函数进行排序;
(5)调用二路归并排序函数进行排序。

三、代码演示:
1、选择排序源代码:

#include<stdio.h>
#include<conio.h>
#define N 10
int E[N] = { 213, 111, 222, 77, 400, 300, 987, 1024, 632, 555 };void s_sort( int e[], int n )/* e:存储线性表的数组 n:线性表的结点个数 */
{int i, j, k, t;for( i = 0; i < n-1; i++ ) {    /* 控制n−1趟的选择步骤 *//* 在e[i], e[i+1],...,e[n−1]中选键值最小的结点e[k] */for( k = i, j = i + 1; j < n; j++ )if( e[k] > e[j] )k = j;if( k != i ) {      /* e[i]与e[k]交换 */t = e[i];e[i] = e[k];e[k] = t;}}
}void main()
{int i;printf( "顺序排序  初始数据序列为:\n" );for( i = 0; i < N; i++ )printf( "%d ", E[i] );s_sort( E, N );   printf( "\n排序后数据序列为:\n" );for( i = 0; i < N; i++ )printf( "%d ", E[i] );getch();
}

2、直接插入排序源代码

#include<stdio.h>
#include<conio.h>
#define N 10
int E[N] = { 213, 111, 222, 77, 400, 300, 987, 1024, 632, 555 };void si_sort( int e[], int n )  /* e:存储线性表的数组  n:线性表的结点个数 */
{int i, j, t;for( i = 1; i < n; i++ ){/* 控制e[i], e[i+1],...,e[n−1]的比较插入步骤 *//* 找结点e[i]的插入位置 */// t = e[i];for(t = e[i]; j >= 0 && t < e[i-1]; j--)e[j+1] = e[j];e[j+1] = t;}
}void main()
{int i;printf( "直接排序  初始数据序列为:\n" );for( i = 0; i < N; i++ )printf( "%d ", E[i] );si_sort( E, N );printf( "\n排序后数据序列为:\n" );for( i = 0; i < N; i++ )printf( "%d ", E[i] );getch();
}

3、冒泡排序

#include<stdio.h>
#include<conio.h>
#define N 10
int E[N] = { 213, 111, 222, 77, 400, 300, 987, 1024, 632, 555 };void sb_sort( int e[], int n )  /* e:存储线性表的数组  n:线性表的结点个数 */
{int j, p, h, t;for( h = n-1; h > 0; h = p ) {for( p = j = 0; j < h; j++ )if( e[j] > e[j+1] ) {t = e[j];e[j] = e[j+1];e[j+1] = t;p = count2;}}
}void main()
{int i;printf( "冒泡排序,初始数据序列为:\n" );for( i = 0; i < N; i++ )printf( "%d ", E[i] );sb_sort( E, N );   printf( "\n排序后数据序列为:\n" );for( i = 0; i < N; i++ )printf( "%d ", E[i] );getch();
}

4、二路归并排序

#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#define N 10
int E[N] = { 213, 111, 222, 77, 400, 300, 987, 1024, 632, 555 };void merge_step( int e[], int a[], int s, int m, int n )    /* 两个相邻有序段的合并 */
{int i, j, k;k = i = s;j = m + 1;while( i <= m && j <= n )   /* 当两个有序都未结束时循环 */if( e[i] <= e[j] )          /* 取其中小的元素复制 */a[k++]=e[i++];elsea[k++] = e[j++];while( i <= m )                 /* 复制还未合并完的剩余部分 */a[k++] = e[i++];while( j <= n )                 /* 复制还未合并完的剩余部分 */a[k++] = e[j++];
}
void merge_pass( int e[], int a[], int n, int len ) 
/* 完成一趟完整的合并 */
{int f_s, s_end;f_s = 0;while( f_s + len < n ) {    /* 至少有两个有序段 */s_end = f_s + 2 * len - 1;if( s_end >= n )            /* 最后一段可能不足len个结点 */s_end = n - 1;merge_step( e, a, f_s, f_s + len - 1, s_end );  /* 相邻有序段合并 */f_s = s_end + 1;            /* 下一对有序段中左段的开始下标为上一对末尾+1 */}if( f_s < n )                   /* 当还剩一个有序段时, 将其从e[]复制到a[] */for( ; f_s < n; f_s++ )a[f_s] = e[f_s];
}void merge( int e[], int n )    /* 二路合并排序 */
{int *p, len=1, f=0;p = (int *)malloc( n * sizeof(int) );while( len < n ) {  /* 交替地在e[]和p[]之间来回合并 */if( f == 0 )merge_pass( e, p, n, len );elsemerge_pass( p, e, n, len );len*=2; /* 一趟合并后,有序结点数加倍 */f = 1 - f;      /* 控制交替合并 */}if( f == 1 )            /* 当经过奇数趟合并时,从p[]复制到e[] */for( f = 0; f < n; f++ )e[f] = p[f];free( p );
}void main()
{int i;printf( "归并排序,初始数据序列为:\n" );for( i = 000; i < N; i++ )printf( "%d ", E[i] );merge( E, N );    printf( "\n排序后数据序列为:\n" );for( i = 0; i < N; i++ )printf( "%d ", E[i] );getch();
}

四、运行结果:
1、选择排序的运行结果:
在这里插入图片描述

2、直接插入排序
在这里插入图片描述

3、冒泡排序
在这里插入图片描述

4、二路归并排序
在这里插入图片描述
五、总结:
1、插入排序:按关键字大小插入到前面已经排好序的子序列中;直接插入排序是稳定的排序,空间复杂度是O(1);最好的情况时间复杂度为O(n),最坏的时间复杂度为O(n²);
2、冒泡排序:时间复杂度T(n)=O(n²);空间复杂度S(n)=O(1);
3、选择排序:每次从当前待排序的记录中选取关键字最小的记录表,然后与待排序的记录序列中的第一个记录进行交换,直到整个记录序列有序为止。简单选择排序:时间复杂度是T(n)=O(n²),空间复杂度是S(n)=O(1);是不稳定的;
4、归并排序:时间复杂度为O(m+n);2-路归并排序,两两归并排序使其有序;时间复杂度无论最好还是最坏都是O(nlog₂n);空间复杂度是O(n);归并排序是稳定的;

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

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

相关文章

Unity图形学之Surface Shader结构

1.没有Pass&#xff1a;因为Render Path已经封装好了 Shader "Custom/Test" {Properties{_Color ("Color", Color) (1,1,1,1)_MainTex ("Albedo (RGB)", 2D) "white" {}_Glossiness ("Smoothness", Range(0,1)) 0.5_Meta…

数据集-目标检测系列- 牵牛花 检测数据集 morning_glory >> DataBall

数据集-目标检测系列- 牵牛花 检测数据集 morning DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 贵在坚持&#xff01; 数据样例项目地址&#xff1a; * 相关项目 1&#xff09;数据集可视化项目&#xff1a;git…

摄影:相机控色

摄影&#xff1a;相机控色 白平衡&#xff08;White Balance&#xff09;白平衡的作用&#xff1a; 白平衡的使用环境色温下相机色温下总结 白平衡偏移与包围白平衡包围 影调 白平衡&#xff08;White Balance&#xff09; 人眼看到的白色&#xff1a;会自动适应环境光线。 相…

Odoo :免费且开源的农牧行业ERP管理系统

文 / 开源智造Odoo亚太金牌服务 引言 提供农牧企业数字化、智能化、无人化产品服务及全产业链高度协同的一体化解决方案&#xff0c;提升企业智慧种养、成本领先、产业互联的核心竞争力。 行业典型痛点 一、成本管理粗放&#xff0c;效率低、管控弱 产品研发过程缺少体系化…

oracle查看锁阻塞-谁阻塞了谁

一 模拟锁阻塞 #阻塞1 一个会话正在往一个大表写入大量数据的时候&#xff0c;另一个会话加字段&#xff1a; #会话1 #会话2 会话2被阻塞了。 #阻塞2 模拟一个会话update一条记录&#xff0c;没提交。 另一个会话也update这一条记录&#xff1a; 会话2被阻塞了。 二 简单查…

HDR视频技术之三:色度学与颜色空间

HDR 技术的第二个理论基础是色度学。从前面的内容中可以了解到&#xff0c;光学以及人类视觉感知模型为人类提供了解释与分析人类感知亮度的理论基础&#xff0c;但是 HDR 技术不仅仅关注于提升图像与视频的亮度范围&#xff0c;同时也关注于提供更加丰富的色彩。因此&#xff…

神经网络中常用的激活函数(公式 + 函数图像)

激活函数是人工神经网络中的一个关键组件&#xff0c;负责引入非线性&#xff0c;从而使神经网络能够学习和表示复杂的非线性关系。没有激活函数&#xff0c;神经网络中的所有计算都是线性变换&#xff0c;而线性模型的表达能力有限&#xff0c;无法处理复杂的任务。 激活函数…

Redis——Raft算法

Raft使用较为广泛的强一致性、去中心化、高可用的分布式协议&#xff0c;即使在网络、节点故障等情况下&#xff0c;多个节点依然能达到一致性。 其中redis、etcd等都用到了这种算法 在Redis集群中&#xff0c;采取的主从复制结构&#xff0c;当主节点宕机后&#xff0c;哨兵会…

C 语言复习总结记录二

C 语言复习总结记录二 一 控制语句 1、语句的分类 表达式语句函数调用语句复合语句控制语句空语句 控制语句 控制程序的执行流程&#xff0c;实现程序的各种结构方式 C 语言支持三种结构 &#xff1a;顺序结构、选择结构、循环结构&#xff0c;由特定的语句定义符组成C语言…

网络无人值守批量装机-cobbler

网络无人值守批量装机-cobbler 一、cobbler简介 ​ 上一节中的pxe+kickstart已经可以解决网络批量装机的问题了,但是环境配置过于复杂,而且仅针对某一个版本的操作系统进批量安装则无法满足目前复杂环境的部署需求。 ​ 本小节所讲的cobbler则是基于pxe+kickstart技术的二…

基于深度学习CNN算法的花卉分类识别系统01--带数据集-pyqt5UI界面-全套源码

文章目录 基于深度学习算法的花卉分类识别系统一、项目摘要二、项目运行效果三、项目文件介绍四、项目环境配置1、项目环境库2、环境配置视频教程 五、项目系统架构六、项目构建流程1、数据集2、算法网络Mobilenet3、网络模型训练4、训练好的模型预测5、UI界面设计-pyqt56、项目…

HarmonyOs鸿蒙开发实战(20)=>一文学会基础使用组件导航Navigation

敲黑板&#xff0c;以下是重点技巧。文章末尾有实战项目效果截图及代码截图可参考 1.概要 Navigation是路由导航的根视图容器Navigation组件主要包含​导航页&#xff08;NavBar&#xff09;和子页&#xff08;NavDestination&#xff09;&#xff0c;导航页不存在页面栈中&am…

tcpdump抓包 wireShark

TCPdump抓包工具介绍 TCPdump&#xff0c;全称dump the traffic on anetwork&#xff0c;是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具。 tcpdump可以支持的功能: 1、在Linux平台将网络中传输的数据包全部捕获过来进行分析 2、支持网络层…

已阻止加载“http://localhost:8086/xxx.js”的模块,它使用了不允许的 MIME 类型 (“text/plain”)。

记录今天解决的一个小bug 在终端启动8080端口号监听后&#xff0c;打开网址http://localhost:8080&#xff0c;发现不能正确加载页面&#xff0c;打开检查-控制台&#xff0c;出现如下警告&#xff1a;已阻止加载“http://localhost:8086/xxx.js”的模块&#xff0c;它使用了不…

使用 helm 部署 gitlab

一、下载 Gitlab chart 进入 artifacthub 官网 选择你想要的版本&#xff08;我选择的chart版本是 8.4.0 , gitlab 版本是17.4.0 &#xff09; 进入到控制台&#xff0c;添加helm仓库 如果你想不改任何配置&#xff0c;你可以执行安装命令&#xff0c;等待安装即可helm instal…

若依-一个请求中返回多个表的信息

背景 主表是点位表关联子表 需要知道对应 合作商的信息关联子表 需要直到对应 区域的信息关联子表 需要直到对应 设备数量 实现的方案 关联实体相关的标签

C++注释

目录 1. 什么是注释 2. 语法 2.1 单行注释 2.2 多行注释 2.3 示例 3. 注释源代码的方法 3.1 使用多行注释 3.2 使用预处理器指令 #if #endif 3.3 使用条件判断语句 if (false) 4. 不能用宏定义&#xff0c;组成注释 5 // \ 会将源代码中的下一行也被当作注释中的一部…

使用itextpdf进行pdf模版填充中文文本时部分字不显示问题

在网上找了很多种办法 都解决不了; 最后发现是文本域字体设置出了问题; 在这不展示其他的代码 只展示重要代码; 1 引入扩展包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</v…

web——sqliabs靶场——第十三关——报错注入+布尔盲注

发现是单引号加括号闭合的 尝试联合注入 发现不太行&#xff0c;那尝试报错注入。 测试报错注入 unameadmin) and updatexml(1,0x7e,3) -- &passwdadmin&submitSubmit 爆数据库 unameadmin) and updatexml(1,concat(0x7e,database(),0x7e),3) -- &passwdadmin&a…

QT如何共享文件+拷贝文件

QString sharedFolderPathImg "\\\\" IP "/profileImage/"; // 更换为你的共享文件夹路径QDir dirImg(sharedFolderPathImg);dirImg.setFilter(QDir::NoDotAndDotDot | QDir::AllEntries);QVector<QString> curFileEntryArrayImg dirImg.entryList…