手撕排序2--选择排序(直接选择+堆排序

目录:

1.直接选择排序  的实现及分析

2.堆排序 的实现及分析


1.直接选择排序

1.1基本思想:

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

1.2

一次排序-->将最大值放在第一个,最小值放在最后一个

代码实现:

#include<stdio.h>
void Swap(int* a, int* b)
{int m = *a;*a = *b;*b = m;
}
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int min_i = begin, max_i = begin;for (int i = begin; i <= end; i++){if (a[i] < a[min_i]){min_i = i;}if (a[i] > a[max_i]){max_i = i;}}Swap(&a[begin], &a[min_i]);if (begin == max_i){max_i = min_i;}Swap(&a[max_i], &a[end]);++begin;--end;}
}
int main()
{int arr[] = {23,45,99,0,1,14,689};int n = sizeof(arr) / sizeof(int);SelectSort(arr, n);printf("最小值为:%d\n", arr[0]);printf("最大值为:%d", arr[n - 1]);return 0;
}

测试结果: 

1.3直接选择排序的特性总结: 

1. 直接选择排序思考非常好理解,但是效率不是很好,实际中很少使用。

2. 时间复杂度:O(N^2)

3. 空间复杂度:O(1)

4. 稳定性:不稳定

2.堆排序 Heapsort

堆排序是利用堆 这种数据结构而设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

2.1什么是堆呢?

堆的逻辑结构是:一棵完全二叉树

       物理结构是:一个数组

每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆

每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆

2.2向下调整算法

前提:该节点的左右子树都为 大/小堆

该算法就是将该节点与左右子树的节点进行比较,重新构建成一个大堆或者小堆。


例如:构建大堆 举例 

2.3 堆排序整体思路:(升序)-->大堆

1. 对待排序的数组,先构建成 堆

2. 从倒数第一个非叶子节点开始调整,把最大的换到最后,不把其看做是堆里的。前n-1个数向下调整,选出次大的数,再跟倒数第二个位置交换........

3. 如此反复执行,便能得到一个有序序列

堆排序的特性总结: 

 1. 堆排序使用堆来选数,效率就高了很多。

2. 时间复杂度:O(N*logN)

3. 空间复杂度:O(1)

4. 稳定性:不稳定 

代码实现:

#include<stdio.h>
void Swap(int* a, int* b)
{int m = *a;*a = *b;*b = m;
}
void AdjustDown(int* a, int n, int root)
{int parent = root;int child = parent * 2 + 1;while (child < n){if (child + 1 < n && a[child + 1] > a[child]){child += 1;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}
void HeapSort(int* a, int n)
{//建堆 O(N)for (int i = (n - 1 - 1) / 2; i >= 0; --i){      AdjustDown(a, n, i);}int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);--end; }          
}
int main()
{int arr[] = { 23,45,11,89,0,14,99 };int n = sizeof(arr) / sizeof(int);HeapSort(arr, n);for (int i = 0; i < n; i++){printf("%d ", arr[i]);}return 0;
}

测试代码: 

谢谢观看,希望对你有所帮助

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

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

相关文章

【启明智显产品介绍】Model3C工业级HMI芯片详解专题(三)通信接口

Model3C 是一款基于 RISC-V 的高性能、国产自主、工业级高清显示与智能控制 MCU, 集成了内置以太网控制器&#xff0c;配备2路CAN、4路UART、5组GPIO、2路SPI等多种通信接口&#xff0c;能够轻松与各种显示设备连接&#xff0c;实现快速数据传输和稳定通信&#xff0c;可以与各…

Error: L6218E: Undefined symbol, 定义--cpp11之后 C函数指针和C++不兼容问题

当我们在定义函数中采用函数指针作为参数时, 头文件(,h文件)中&#xff0c; 使用如下代码: #ifdef __cplusplusextern "C"{ #endif //ESP_Error_t esp8266_sendcmd(const char* cmd, const char* response, uint8_t (*cmd_function)(ESP_MSG_LIST));#ifdef __cplus…

elementplus如何实现dialog遮罩层外的元素可以被操作点击

elementplus如何实现dialog遮罩层外的元素可以被操作点击 element plus 组件库中的 dialog 组件可以说是使用频率最高的组件之一&#xff0c;它的效果是弹出一个对话框&#xff0c;外面默认会有一个蒙层。 现在我碰到的需求是&#xff0c;弹窗要正常显示&#xff0c;但是蒙层下…

R语言——类与对象

已知2024年4月23日是星期五&#xff0c;编写一个函数day.in.a.week (x, y,z)&#xff0c;参数x和y和z分别代表年月日&#xff0c;判断这一天是否存在&#xff08;例如&#xff0c;2018年没有2月29日&#xff0c;也没有11月31日&#xff09;&#xff0c;如果不存在&#xff0c;返…

Howtrader在服务器上安装后遇到的问题

response:{"code":-1021,"msg":"Timestamp for this request is outside of the recvWindow."} 1.安装 NTP 服务 如果你的系统还没有安装 NTP&#xff0c;可以通过以下命令安装&#xff1a; sudo apt update sudo apt install ntp2.配置 NTP …

ELK+Filebeat+kafka+zookeeper构建海量日志分析平台

ELK是什么&#xff08;What&#xff09;&#xff1f; ELK组件介绍 ELK 是ElasticSearch开源生态中提供的一套完整日志收集、分析以及展示的解决方案&#xff0c;是三个产品的首字母缩写&#xff0c;分别是ElasticSearch、Logstash 和 Kibana。除此之外&#xff0c;FileBeat也是…

【Hive SQL】Hive Sql 列转行(lateral view 与 explode 、posexplode)详解

Hive Sql Hive Sql 列转行&#xff08;lateral view 与 explode 、posexplode&#xff09;详解 explode 描述 将hive某列一行中复杂的 array 或 map 结构拆分成多行&#xff08;只能输入array或map&#xff09;。 通常&#xff0c;explode函数会与lateral view一起结合使用…

【面试干货】抽象类的意义与应用

【面试干货】抽象类的意义与应用 1、为其他子类提供一个公共的类型2、封装子类中重复定义的内容3、定义抽象方法&#xff0c;子类虽然有不同的实现&#xff0c;但是定义时一致的4、示例代码 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在…

kettle从入门到精通 第七十二课 ETL之kettle 三谈http post(含文件上传),彻底掌握参数传递

场景&#xff1a;群里有个小伙伴在使用http post步骤调用接口时遇到问题&#xff0c;postman调用正常&#xff0c;但是kettle中调用异常。 解决方案&#xff1a;既然postman调用接口正常&#xff0c;肯定是http post步骤中某些参数设置的不正确导致的。那就把常用的方式都梳理下…

探索AI前沿:本地部署GPT-4o,打造专属智能助手!

目录 1、获取API_key 2、开始调用 3、openai连接异常 4、解决方法&#xff1a; 5、调用GPT-4o 1、获取API_key 这里就不多赘述了&#xff0c;大家可以参考下面这篇博客 怎么获取OpenAI的api-key【人工智能】https://blog.csdn.net/qq_51625007/article/details/13763274…

Open WebUI的SearXNG网络搜索配置【403报错解决方法】

1.拉取SearXNG镜像 docker pull searxng/searxng 2.在Docker Desktop的Images界面中启动searxng容器 3.查看searxng是否部署成功 在Docker Desktop的Containers界面中&#xff0c;查看searxgn暴露的端口。 http://localhost:31292/ 4.修改settings.yml配置参数 在Docker De…

shell编程之条件语句(shell脚本)

条件测试操作 要使shell脚本程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作。例如,当磁盘使用率超过95%时,发送告警信息;当备份目录不存在时,能够自动创建;当源码编译程序时,若配置失败则不再继续安装等。 shell环境根据命令执行后…

[火灾警报系统]yolov5_7.0-pyside6火焰烟雾识别源码

国内每年都会发生大大小小的火灾&#xff0c;造成生命、财产的损失。但是很多火灾如果能够早期发现&#xff0c;并及时提供灭火措施&#xff0c;将会大大较小损失。本套源码采用yolov5-7.0目标检测算法结合pyside6可视化界面源码&#xff0c;当检测到火灾时&#xff0c;能否发出…

模方4.0导出osgb模型一直提示正在运行任务,请取消所有任务后再尝试?

答&#xff1a;可以选择任务列表中的所有瓦块右键&#xff0c;取消全部&#xff0c;然后再选择瓦块导出 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能&#x…

力扣901.股票价格跨度

力扣901.股票价格跨度 单调栈 若当前价格 > 栈顶元素 弹出栈顶元素找到最远的符合要求的 class StockSpanner {stack<pair<int,int>> st;int cur_day -1;public:StockSpanner() {st.emplace(-1,INT_MAX);}int next(int price) {while(price > st.top().s…

链式二叉树

链式二叉树 链式二叉树结构二叉树的遍历二叉树前序遍历二叉树中续遍历二叉树后续遍历二叉树层序遍历 二叉树节点个数和高度等二叉树节点个数二叉树叶子节点个数二叉树第k层节点个数单值二叉树对称二叉树相同的二叉树二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历另一棵树的…

SpringCloud 基于Nacos和Eureka 实现双注册双订阅

一、使用场景/原因 过渡期迁移: 当系统从一个服务注册中心迁移到另一个时&#xff0c;例如从 Eureka 迁移到 Nacos&#xff0c;可以在过渡期内同时使用两个注册中心&#xff0c;确保服务平稳迁移&#xff0c;逐步过渡&#xff0c;避免一次性切换带来的风险。 兼容性考虑: 不同的…

ASP.NET Core 6.0 使用 Log4Net 和 Nlog日志中间件

前言 两年前,浅浅的学过 .NET 6,为啥要记录下来,大概是为了以后搭架子留下引线,还有抛砖引玉。 1. 环境准备 下载 建议使用 Visual Studio 2022 开发版 官网的下载地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具借助 Visual Studio 设计,具有自动完成…

混合专家模型和LLAMA的详细配置

文章目录 混合专家模型LLAMA的详细配置混合专家模型 大语言模型能够通过扩展参数规模实现性能的提升。然而,随着模型参数规模的扩大,计算成本也随之增加。为了解决这一问题,研究人员在大语言模型中引入了基于稀疏激活的混合专家架构(Mixture-of-Experts, MoE),旨在不显著…

支付宝推出NFC(近场通信)碰一碰支付功能

近日&#xff0c;支付宝推出NFC&#xff08;近场通信&#xff09;碰一碰支付功能&#xff0c;支持iPhone、安卓手机。NFC支付早已不是新事物&#xff0c;从二维码支付重回NFC支付&#xff0c;支付宝能撬动市场吗&#xff1f; 根据网友反馈&#xff0c;目前支付宝正在上海静安大…