排序算法(选择排序、直接插入排序、冒泡排序、二路归并排序)(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.mzph.cn/bicheng/61831.shtml

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

相关文章

当产业经济插上“数字羽翼”,魔珐有言AIGC“3D视频创作大赛”成功举办

随着AI技术的飞速发展&#xff0c;3D数字人技术已成为驱动各行各业转型升级的重要力量。在这一背景下&#xff0c;2024山东3D数字人视频创作大赛应运而生&#xff0c;并在一番激烈的角逐后圆满落幕&#xff0c;为科技与创意的交融写下浓墨重彩的一笔。 11月20日&#xff0c;一…

Unity-添加世界坐标系辅助线

如果你想在场景中更直观地显示世界坐标系&#xff0c;可以通过编写一个简单的脚本来实现。下面是一个基本的示例脚本&#xff0c;它会在场景中绘制出世界坐标系的三个轴&#xff1a; using UnityEngine;public class WorldAxesIndicator : MonoBehaviour {public float length…

解密自闭症儿童康复秘籍,让孩子重新展开羽翼

在广州这座繁华都市的一隅&#xff0c;隐藏着一片静谧而温暖的天地——星贝育园自闭症儿童寄宿制学校。这里&#xff0c;没有喧嚣与浮躁&#xff0c;只有爱与耐心交织的旋律&#xff0c;为自闭症儿童编织着一个又一个康复的奇迹。星贝育园&#xff0c;如同一盏明灯&#xff0c;…

豆包MarsCode算法题:三数之和问题

问题描述 思路分析 1. 排序数组 目的: 将数组 arr 按升序排序&#xff0c;这样可以方便地使用双指针找到满足条件的三元组&#xff0c;同时避免重复的三元组被重复计算。优势: 数组有序后&#xff0c;处理两个数和 target - arr[i] 的问题可以通过双指针快速找到所有可能的组…

计算机网络socket编程(5)_TCP网络编程实现echo_server

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(5)_TCP网络编程实现echo_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交…

游戏引擎学习第21天

虽然没有上一节的难但是内容也很多 关于实现和使用脚本语言 以下是详细复述&#xff1a; 许多人经常问一个问题&#xff0c;反复问过好几次&#xff0c;那就是&#xff1a;是否会在项目中实现脚本语言。这个问题的具体形式通常是&#xff1a;你们会使用脚本语言吗&#xff1…

《线性代数的本质》

之前收藏的一门课&#xff0c;刚好期末复习&#xff0c;顺便看一看哈哈 课程链接&#xff1a;【线性代数的本质】合集-转载于3Blue1Brown官方双语】 向量究竟是什么 线性代数中最基础、最根源的组成部分就是向量&#xff0c;需要先明白什么是向量 不同专业对向量的看法 物理专…

Django+Nginx+uwsgi网站使用Channels+redis+daphne实现简单的多人在线聊天及消息存储功能

网站部署在华为云服务器上&#xff0c;Debian系统&#xff0c;使用DjangoNginxuwsgi搭建。最终效果如下图所示。 一、响应逻辑顺序 1. 聊天页面请求 客户端请求/chat/&#xff08;输入聊天室房间号界面&#xff09;和/chat/room_name&#xff08;某个聊天室页面&#xff09;链…

鸿蒙多线程开发——线程间数据通信对象03(sendable)

1、简 介 在传统JS引擎上&#xff0c;对象的并发通信开销的优化方式只有一种&#xff0c;就是把实现下沉到Native侧&#xff0c;通过Transferable对象的转移或共享方式降低并发通信开销。而开发者仍然还有大量对象并发通信的诉求&#xff0c;这个问题在业界的JS引擎实现上并没…

OpenHarmony-3.驱动HDF

OpenHarmony HDF 框架 1.OpenHarmony HDF 框架概述 OpenHarmony驱动子系统采用C面向对象编程模型构建&#xff0c;通过平台解耦、内核解耦&#xff0c;兼容不同内核&#xff0c;提供了归一化的驱动平台底座&#xff0c;旨在为开发者提供更精准、更高效的开发环境&#xff0c;力…

ESP8266 STA模式TCP客户端 电脑手机网络调试助手

1.STA模式TCP客户端和电脑网络调试助手 2.STA模式TCP客户端和手机网络调试助手

【JavaEE进阶】 JavaScript

本节⽬标 了解什么是JavaScript, 学习JavaScript的常⻅操作, 以及使⽤JQuery完成简单的⻚⾯元素操作. 一. 初识 JavaScript 1.JavaScript 是什么 JavaScript (简称 JS), 是⼀个脚本语⾔, 解释型或即时编译型的编程语⾔. 虽然它是作为开发Web⻚⾯的脚本语⾔⽽出名&#xff0c;…

神经网络(系统性学习一):入门篇——简介、发展历程、应用领域、基本概念、超参数调优、网络类型分类

相关文章&#xff1a; 神经网络中常用的激活函数 神经网络简介 神经网络&#xff08;Neural Networks&#xff09;是受生物神经系统启发而设计的数学模型&#xff0c;用于模拟人类大脑处理信息的方式。它由大量的节点&#xff08;或称为“神经元”&#xff09;组成&#xff0…

缓冲区的奥秘:解析数据交错的魔法

目录 一、理解缓存区的好处 &#xff08;一&#xff09;直观性的理解 &#xff08;二&#xff09;缓存区的好处 二、经典案例分析体会 &#xff08;一&#xff09;文件读写流&#xff08;File I/O Buffering&#xff09; BufferedOutputStream 和 BufferedWriter 可以加快…

SpringBoot 集成 html2Pdf

一、概述&#xff1a; 1. springboot如何生成pdf&#xff0c;接口可以预览可以下载 2. vue下载通过bold如何下载 3. 一些细节&#xff1a;页脚、页眉、水印、每一页得样式添加 二、直接上代码【主要是一个记录下次开发更快】 模板位置 1. 导入pom包 <dependency><g…

MySQL Join 的原理与优化实践

文章目录 引言一、基础准备&#xff1a;创建环境与示例数据1. 初始化示例表2. 示例 Join 查询3. EXPLAIN 输出分析 二、MySQL Join 的核心算法与执行机制1. 三种 Join 算法的实现与原理1.1 Index Nested-Loop Join&#xff08;INLJ&#xff09;1.2 Simple Nested-Loop Join&…

阿里Qwen系列开源模型介绍

模型种类丰富 Qwen2&#xff1a;包含Qwen2-0.5b、Qwen2-1.5b、Qwen2-7b、Qwen2-57b-a14b以及Qwen2-72b等五种规模的预训练和指令微调模型&#xff0c;其在多语言处理、长文本处理、代码生成、数学和逻辑推理等能力上&#xff0c;在mmlu、gpqa、humaneval等国际测评中得到了验证…

Redis设计与实现 学习笔记 第二十章 Lua脚本

Redis从2.6版本引入对Lua脚本的支持&#xff0c;通过在服务器中嵌入Lua环境&#xff0c;Redis客户端可以使用Lua脚本&#xff0c;直接在服务器端原子地执行多个Redis命令。 其中EVAL命令可以直接对输入的脚本进行求值&#xff1a; 而使用EVALSHA命令则可以根据脚本的SHA1校验…

DevOps 之 CI/CD入门操作 (二)

CI/CD简介 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 一、CI流程 1.1 新建项目 新建一个简单的springboot项目 写一个简单的Controller 运行测…

C++ STL - vector/list讲解及迭代器失效

vector 使用 vector 是一个动态数组. 构造/拷贝构造/赋值重载函数 int main() {// 是一个模板, 在实例化的时候, 需要指明类型std::vector<int> first; // 一个空的数组std::vector<int> second (4,100); // 设置初始空间大小为 4 个int, 全部初始化为 100std::v…