数据结构-C语言-排序(2)

        代码位置:test-c-2024: 对C语言习题代码的练习 (gitee.com)

一、前言:

1.1-排序定义:

排序就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。(注:我们这里的排序采用的都为升序)

1.2-排序分类:

常见的排序算法:
  • 插入排序
    a. 直接插入排序
    b. 希尔排序

  • 选择排序
    a. 选择排序
    b. 堆排序
  • 交换排序
    a. 冒泡排序
    b. 快速排序
  • 归并排序
    a. 归并排序
  • 非比较排序
    a.计数排序
    b.基数排序

1.3-算法比较:

1.4-目的:

        今天,我们这里要实现的是选择排序、堆排序、冒泡排序

二、选择排序:

2.1-思路:

        1.找到数组中最小的元素,拎出来,将它和数组的第一个元素交换位置;

        2.找到数组中最大的元素,拎出来,将它和数组的最后一个元素交换位置;        

        3.在剩下的元素中继续寻找最小的元素,拎出来,和数组的第二个元素交换位置;

        4.在剩下的元素中继续寻找最大的元素,拎出来,和数组的倒数第二个元素交换位置;

        5.需要注意max若与left位置相同时需特殊处理,否则位置交换会出现问题;

        6.如此循环,直到整个数组排序完成;

        7.若是由大到小也是同样方法,只需要修改比较大小的符号;

2.2-过程图:

2.3-代码:


//升序
void SelectSort(int* a, int len)			//选择排序---时间复杂度(O(N^2))
{printf("原数组顺序:");for (int i = 0; i < len; i++){printf("%d  ", a[i]);}printf("\n");int left = 0;int right = len - 1;int max = 0;int min = 0;while (left < right){max = min = left;for (int i=left; i<=right; i++){if (a[i] > a[max])max = i;if (a[i] < a[min])min = i;}Swap(&a[left], &a[min]);if (max == left){max = min;}Swap(&a[right], &a[max]);++left;right--;printf("第%d时排序:",left);for (int i = 0; i < len; i++){printf("%d  ", a[i]);}printf("\n");}}

2.4-效果图:

2.5-性质:

由上述代码及图片见:

时间复杂度:

        简单选择排序是通过两层循环实现。 第一层循环:依次遍历序列当中的每一个元素 第二层循环:将遍历得到的当前元素依次与余下的元素进行比较,符合最小元素的条件,则交换。每次循环时间复杂度都为O(N)所以选择排序时间复杂度为O(N^2)

空间复杂度:

        因为没开辟空间,所以空间复杂度为O(1)。

稳定性:

        选择排序是一种不稳定的排序算法。 我们可以从上面的图片中看出,选择排序每次都要找剩余未排序元素中的最小值,并和前面的元素交换位置,这样破坏了稳定性。 比如说:5,8,5,2,9 这样一组数据,使用选择排序算法来排序的话,第一次找到最小元素 2,与第一个 5 交换位置,那第一个 5 和中间的 5 顺序就变了,所以选择排序是不稳定的排序算法

三、堆排序:

3.1-思路:

        对于堆排序,我们首先要将无序的数组建成大堆,大堆的话有助于排升序。因为大堆可以确定最大值,我们只需将首元素与尾元素交换,然后去除尾元素,继续进行向下调整,最后进行循环,直到排序完成为止。

3.2-过程图:

3.3-代码:


void AdjustDown(int* a, int len, int parent)			//向下调整---时间复杂度(O(logN))
{int child = parent * 2 + 1;while(child<len){if (child+1<len && a[child] < a[child + 1]){++child;}if (a[child] > a[parent]){Swap(&a[parent], &a[child]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HeapSort(int* a, int len)			//堆排序---时间复杂度(O(N*logN))
{printf("原数组顺序:");for (int i = 0; i < len; i++){printf("%d  ", a[i]);}printf("\n");//建大堆---时间复杂度(O(N))for (int i = (len - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, len, i);}printf("建堆后数组顺序:");for (int i = 0; i < len; i++){printf("%d  ", a[i]);}printf("\n");//自我实现排序---时间复杂度(O(N*logN))int end = len-1;int n = 1;while(end>0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);--end;printf("第%d趟排序:",n++);for (int i = 0; i < len; i++){printf("%d  ", a[i]);}printf("\n");}}

3.4-效果图:

3.5-性质:

时间复杂度:

        由于向下调整函数的时间复杂度为O(logN),遍历数组的时间复杂度为O(N),所以堆排序的时间复杂度为O(N*logN)

空间复杂度:

        因为没开辟空间,所以空间复杂度为O(1)。

稳定性:

        堆排序是通过反复调整元素位置来完成排序的过程,其中涉及到交换操作。这些交换操作可能导致相同键值元素的相对顺序发生变化,因此堆排序是一个不稳定的排序算法

四、冒泡排序:

4.1-思路:

        通过对待排序序列从前向后(从下标较小的元素开始),依次对相邻两个元素的值进行两两比较,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就如果水底下的气泡一样逐渐向上冒。

4.2-过程图:

4.3-代码:


void BubbleSort(int* a, int len)			//冒泡排序---时间复杂度(O(N^2))
{printf("原数组顺序:");for (int i = 0; i < len; i++){printf("%d  ", a[i]);}printf("\n");for (int j = 0; j < len - 1; j++){int judge = 1;		//判断数组是否有序for (int i = 0; i < len - j-1; i++){if (a[i] > a[i + 1])		{Swap(&a[i], &a[i + 1]);judge = 0;		//如果进循环说明无序令judge为0}}printf("第%d趟排序:", j + 1);for (int i = 0; i < len; i++){printf("%d  ", a[i]);}printf("\n");if (judge){return;}}}

4.4-效果图:

4.5-性质:

时间复杂度:

        冒泡排序算法是一种基于比较的排序算法,每次冒泡过程,都会有一个数据确定位置。最坏的情况下需经过n-1次冒泡,就有n个数据确定了位置时间复杂度为O(N^2),但若是我们加入判断条件则最好的情况下可提前结束循环最好的情况下只需经过2次冒泡即可此时时间复杂度为O(N)

空间复杂度:

        因为没开辟空间,所以空间复杂度为O(1)。

稳定性:

        冒泡排序是相邻元素之间的比较,此时我们可以控制相同元素的位置,所以冒泡排序是稳定性的算法。

五、结语:

        上述内容,即是我个人对数据结构排序中选择排序、堆排序、冒泡排序的个人见解以及自我实现。若有大佬发现哪里有问题可以私信或评论指教一下我这个小萌新。非常感谢各位友友们的点赞,关注,收藏与支持,我会更加努力的学习编程语言,还望各位多多关照,让我们一起进步吧!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu 22.04.4 LTS (linux) 安装iftop 监控网卡流量 软件

1 安装iftop sudo apt update sudo apt-get install iftop 2 监控网卡 sudo iftop -i eth0 -n -p 界面最上面&#xff0c;显示的是类似刻度尺的刻度范围&#xff0c;显示流量图形的长条作标尺用的。 中间的< >这两个左右箭头&#xff0c;表示的是流量的进出方向.TX&…

SQL Server的视图

SQL Server的视图 一、基础 SQL 视图&#xff08;Views&#xff09;是一种虚拟表&#xff0c;是基于 SQL 查询结果生成的。这些虚拟表可以包含来自一个或多个表的数据&#xff0c;并且可以像表一样查询&#xff1b;视图是一个表中的数据经过某种筛选后的显示方式&#xff0c;或…

3D数字孪生项目运行卡顿,来看看它要求的电脑配置。

有些小伙伴和我说&#xff0c;数字孪生项目运行卡顿&#xff0c;不知道啥原因&#xff0c;根源还是这类项目是浏览器渲染&#xff0c;对电脑配置要求很高。 运行3D数字孪生项目需要一台性能强大的电脑&#xff0c; 以下是一个推荐的配置清单&#xff1a; 1. 处理器&#xff1…

百度人脸识别Windows C++离线sdk C#接入

百度人脸识别Windows C离线sdk C#接入 目录 说明 设计背景 • 场景特点&#xff1a; • 客户特点&#xff1a; • 核心需求&#xff1a; SDK 包结构 效果 代码 说明 自己根据SDK封装了动态库&#xff0c;然后C#调用。 功能接口 设计背景 • 场景特点&#xff1a; -…

中国姓名学大师排行榜,山东济南最有名的起名大师是谁

在2024年揭晓的中国姓名学领域&#xff0c;一场声势浩大的评选活动吸引了无数目光——寻找国内最杰出的起名大师。在这场激烈的竞争中&#xff0c;山东济南的颜廷利教授以其深厚的易学功底和卓越的命名技艺&#xff0c;荣获“中国姓名学十大权威专家”榜首位置&#xff0c;成为…

nftables(7)集合(SETS)

简介 在nftables中&#xff0c;集合&#xff08;sets&#xff09;是一个非常有用的特性&#xff0c;它允许你以集合的形式管理IP地址、端口号等网络元素&#xff0c;从而简化规则的配置和管理。 nftables提供了两种类型的集合&#xff1a;匿名集合和命名集合。 匿名集合&…

php相关

php相关 ​ 借鉴了小迪安全以及各位大佬的博客&#xff0c;如果一切顺利&#xff0c;会不定期更新。 如果感觉不妥&#xff0c;可以私信删除。 默认有php基础。 文章目录 php相关1. php 缺陷函数1. 与2. MD53. intval()4. preg_match() 2. php特性1. php字符串解析特性2. 杂…

注册安全分析报告:OneApm

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

[Vulnhub] digitalworld.local-JOY snmp+ProFTPD权限提升

信息收集 IP AddressOpening Ports192.168.101.150TCP:21,22,25,80,110,139,143,445,465,587,993,995 $ nmap -p- 192.168.101.150 --21,22,25,min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD | ftp-anon: Anonymous FTP logi…

idea中使用maven

默认情况下&#xff0c;idea会自动下载并安装maven&#xff0c;这不便于我们管理。 最好是自行下载maven&#xff0c;然后在idea中指定maven的文件夹路径

对服务器进行基本了解(二)

目录 一. 云服务器数据库 1.查看MYSQL版本 2.查看mysql的运行状态 3.运行mysql 4. 进入mysql的用户 5. 更改用户密码 6. 查找mysql端口号 7. 创建一个数据库 8. 查看用户 9. 查看数据库 10. 显示数据库的表 11. 修改用户的host 12. 对用户赋权 13. 开放指定端…

TF/SD卡开发驱动(SPI)

TF与SD卡本质上来说都是flash类型的存储器 可以理解为TF卡是SD卡的升级版&#xff0c;体积小功能强大&#xff0c;SD卡是传统意义上的存储卡&#xff0c;适用范围比较广&#xff0c;而SD卡的驱动方式有两种 SDIO 和 SPI&#xff0c;同理TF卡也是一样 &#xff08;在资源足够…

TCP与UDP的理解

文章目录 UDP协议UDP协议的特点UDP的应用以及杂项 TCP协议TCP协议段格式解释和TCP过程详解确认应答机制 -- 序号和确认序号以及6位标志位中的ACK超时重传机制连接管理机制 与标志位SYN,FIN,ACK滑动窗口流量控制拥塞控制延迟应答捎带应答和面向字节流粘包问题TCP异常情况TCP特点…

智慧园区/景区建设方案PPT(72页)

智慧园区建设方案摘要&#xff1a; 项目背景及建设意义作为重庆市重点文旅产业转型升级示范项目&#xff0c;是十三五重点项目。项目由主题乐园、酒店、商业、地产等多部分组成&#xff0c;规划用地2025亩&#xff0c;总建筑62.5万平方米。整体定位为打造中国第一个数字地球小镇…

Linux 安装 Docker Compose

Docker Compose 是一种用于定义、运行和管理多容器Docker应用程序的工具&#xff0c;通过YAML文件配置服务&#xff0c;实现一键启动和停止所有服务。 以下是如何在 Linux 系统上安装 Docker Compose 的步骤 1. 下载 Docker Compose 可执行文件 wget https://github.com/dock…

08-8.6.1 外部排序

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

前端JS特效第40波:常用相册图片左右点击切换轮播js特效

常用相册图片左右点击切换轮播js特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>常用相册图片左右点击切换轮播js特效</title><met…

Google Earth Engine(GEE)——北京地区简单的除云影像展示(云量小于10的影像展示)

结果 函数: 函数: ee.Algorithms.Landsat.simpleCloudScore(image) Computes a simple cloud-likelihood score in the range [0,100] using

【算法】LRU缓存

难度&#xff1a;中等 题目&#xff1a; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;…

React、Vue的password输入框组件,如何关闭自动填充?

有时候我们的表单使用了一个password组件&#xff0c;这时候每次打开新建&#xff0c;都会自动获取浏览器缓存的密码&#xff0c;但是它的上一个input输入框并不是用户名&#xff0c;这时候我们希望我们的表单&#xff0c;每次点开的时候密码是空的&#xff0c;让用户自动输入&…