C++力扣Leetcode算法4--排序算法

目录

快速排序--递归

归并排序--递归

插入排序

冒泡排序

选择排序

215 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

347. 前 K 个高频元素


快速排序--递归

void quick_sort(vector<int> &nums, int l, int r) {if (l + 1 >= r) {return;}int first = l, last = r - 1, key = nums[first];while (first < last){while(first < last && nums[last] >= key) {--last;}nums[first] = nums[last];while (first < last && nums[first] <= key) {++first;}nums[last] = nums[first];}nums[first] = key;quick_sort(nums, l, first);quick_sort(nums, first + 1, r);
}

归并排序--递归

void merge_sort(vector<int> &nums, int l, int r, vector<int> &temp) {if (l + 1 >= r) {return;}
// divideint m = l + (r - l) / 2;merge_sort(nums, l, m, temp);merge_sort(nums, m, r, temp);
// conquerint p = l, q = m, i = l;while (p < m || q < r) {if (q >= r || (p < m && nums[p] <= nums[q])) {temp[i++] = nums[p++];} else {temp[i++] = nums[q++];}}for (i = l; i < r; ++i) {nums[i] = temp[i];}
}

插入排序

void insertion_sort(vector<int> &nums, int n) {for (int i = 0; i < n; ++i) {for (int j = i; j > 0 && nums[j] < nums[j-1]; --j) {swap(nums[j], nums[j-1]);}}
}

冒泡排序

void bubble_sort(vector<int> &nums, int n) {bool swapped;for (int i = 1; i < n; ++i) {swapped = false;for (int j = 1; j < n - i + 1; ++j) {if (nums[j] < nums[j-1]) {swap(nums[j], nums[j-1]);swapped = true;}}if (!swapped) {break;}}
}

选择排序

void selection_sort(vector<int> &nums, int n) {int mid;for (int i = 0; i < n - 1; ++i) {mid = i;for (int j = i + 1; j < n; ++j) {if (nums[j] < nums[mid]) {mid = j;}}swap(nums[mid], nums[i]);}
}

排序调用方法

void sort() {vector<int> nums = {1,3,5,7,2,6,4,8,9,2,8,7,6,0,3,5,9,4,1,0};vector<int> temp(nums.size());sort(nums.begin(), nums.end());quick_sort(nums, 0, nums.size());merge_sort(nums, 0, nums.size(), temp);insertion_sort(nums, nums.size());bubble_sort(nums, nums.size());selection_sort(nums, nums.size());
}

215 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

书中最优解

int pointers::findKthLargest(vector<int>& nums, int k)
{int l = 0, r = nums.size() - 1, target = nums.size() - k;while (l < r) {int mid = quickSelection(nums, l, r);if (mid == target) {return nums[mid];}if (mid < target) {l = mid + 1;}else {r = mid - 1;}}return nums[l];
}// 辅函数 - 快速选择
int quickSelection(vector<int>& nums, int l, int r) {int i = l + 1, j = r;while (true) {while (i < r && nums[i] <= nums[l]) {++i;}while (l < j && nums[j] >= nums[l]) {--j;}if (i >= j) {break;}swap(nums[i], nums[j]);}swap(nums[l], nums[j]);return j;
}

本人写,提交超出时间限制

int pointers::findKthLargest(vector<int>& nums, int k)
{int len = nums.size();for (int i = 0; i < len; ++i) {for (int j = i; j >0 && nums[j]<nums[j-1]; --j) {swap(nums[j], nums[j - 1]);}}return nums[len-k];
}

347. 前 K 个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。
你可以按 任意顺序 返回答案。

解:桶排序

书中最优解

vector<int> pointers::topKFrequent(vector<int>& nums, int k)
{unordered_map<int, int> counts;/*unordered_map容器用来存储键值对,其中键为int型,值为int型,可以用counts[key]++方式增加某个键的值,如果键不存在,会自动插一个新的键值对,值为0由于unordered_map不允许存储具有重复键的元素,因此count()函数本质上检查unordered_map中是否存在具有给定键的元素。*/int max_count = 0;//统计每个元素出现的次数,实现数:频率for (const int& num : nums) {max_count = max(max_count, ++counts[num]);}vector<vector<int>> buckets(max_count + 1);  //行数max_count + 1//将次数为i的元素放入i桶中,实现频率:数,通过键值相互交换达到value排序的目的,这种写法更符合C++for (const auto& p : counts) {buckets[p.second].push_back(p.first);}vector<int> ans;for (int i = max_count; i >= 0 && ans.size() < k; --i) {for (const int& num : buckets[i]) {ans.push_back(num);if (ans.size() == k) {break;}}}return ans;}

学习:leetcode-347. 前K个高频元素 - ggaoda - 博客园 (cnblogs.com)

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

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

相关文章

Python 版分布式消息队列 Kafka 实现图片数据传输

1、Kafka 介绍 在使用 Kafka 之前&#xff0c;通常需要先安装和配置 ZooKeeper。ZooKeeper 是 Kafka 的依赖项之一&#xff0c;它用于协调和管理 Kafka 集群的状态。 ZooKeeper 是一个开源的分布式协调服务&#xff0c;它提供了可靠的数据存储和协调机制&#xff0c;用于协调…

清远某国企IBM服务器Board故障上门维修

接到一台来自广东清远市清城区某水利大坝国企单位报修一台IBM System x3650 M4服务器无法开机的故障&#xff0c;分享给大家&#xff0c;同时也方便有需要的朋友能及时找到我们快速解决服务器问题。 故障服务器型号&#xff1a;IBM System x3650 M4 服务器使用单位&#xff1a;…

docker、ctr、crictl命令对比

命令dockerctr&#xff08;containerd&#xff09;crictl&#xff08;kubernetes&#xff09;查看运行的容器docker psctr task ls/ctr container lscrictl ps查看镜像docker imagesctr image lscrictl images查看容器日志docker logs无crictl logs查看容器数据信息docker insp…

厂区3D全景线上漫游体验突破现实时空阻碍

智慧园区&#xff0c;作为现代城市发展的重要引擎&#xff0c;其管理效率和安全监控的需求日益凸显。而720VR全景展示技术的引入&#xff0c;无疑为智慧园区的建设注入了新的活力。通过360全空间无死角的视觉展示&#xff0c;用户可以身临其境地感受园区的每一个角落&#xff0…

记账本|基于SSM的家庭记账本小程序设计与实现(源码+数据库+文档)

家庭记账本小程序目录 基于SSM的家庭记账本小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、小程序端&#xff1a; 2、后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

【opencv】示例-imagelist_reader.cpp 读取YAML格式文件中的图片列表,并逐个显示这些图片的灰度图...

这段代码的功能是使用OpenCV库读取一个YAML或XML格式文件中的图片列表&#xff0c;并且逐个地在窗口中以灰度图像的形式显示这些图片。用户可以按任意键来查看下一张图片。程序提供了帮助信息输出&#xff0c;指导用户如何使用该程序。此外&#xff0c;它使用命令行参数解析器来…

8266 Ubuntu下 arduino开发

8266 NodeMCU arduino开发 直接用usb连接8266的usb接口即可,设备中会出现/dev/ttyUSB0, 需要将其权限设置下sudo usermod -a -G dialout $USER. logout后生效. 下载arduino IDE,做以下设置: file/preferences Additional boards manager URLS设置为http://arduino.esp8266.co…

NCCL集合通信算子DEMO及性能测试

NCCL集合通信算子DEMO及性能测试 一.复现代码 以下代码用于测试NCCL算子的性能及正确性 一.复现代码 tee ccl_benchmark.py <<-EOF import os import torch import argparse import torch.distributed as dist from torch.distributed import ReduceOp from datetime im…

(文章复现)考虑网络动态重构的分布式电源选址定容优化方法

参考文献&#xff1a; [1]朱俊澎,顾伟,张韩旦,等.考虑网络动态重构的分布式电源选址定容优化方法[J].电力系统自动化,2018,42(05):111-119. 1.摘要 以投资周期经济收益最高为目标&#xff0c;基于二阶锥规划提出了一种考虑网络动态重构的分布式电源选址定容优化方法。首先&am…

毅四捕Go设计模式笔记——责任链模式

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 为了解决什么问题&#xff1f; 责任链模式的目的是为了将请求的发送者和接收者解耦。它允许多个处理器都有机会处理请求&#xff0c;将这些处理器连接成一条链&#xff0c;并沿着这条链传递请求&#xff…

Linux磁盘空间问题排查记录

问题 pip install时总提示OSError(28, ‘No space left on device’)或者ERROR: Could not install packages due to an OSError: [Errno 28] No space left on device 分析 很明显&#xff0c;磁盘空间不足。尝试了以下方法&#xff0c;没有解决问题&#xff1a; 清理pip缓…

给现有rabbitmq集群添加rabbitmq节点

现有的&#xff1a;10.2.59.216 rabbit-node1 10.2.59.217 rabbit-node2 新增 10.2.59.199 rabbit-node3 1、分别到官网下载erlang、rabbitmq安装包&#xff0c;我得版本跟现有集群保持一致。 erlang安装包&#xff1a;otp_src_22.0.tar.gz rabbitmq安装包&#xff1…

详解App Inventor 2 中的文件作用域(作用范围):App、程序包、缓存、兼容、私有、共享

本文内容来自中文网文档“文件管理器”组件部分&#xff0c;详细介绍了每一种文件作用域的特点及用法。 下面是每种作用域类型的简述&#xff1a; App [推荐] &#xff1a;Android 2.2及更高版本上文件将从应用程序特定存储中读取和写入&#xff0c;在 Android 早期版本上&…

STM32—DMA直接存储器访问详解

DMA——直接存储器访问 DMA&#xff1a;Data Memory Access, 直接存储器访问。 DMA和我们之前学过的串口、GPIO都是类似的&#xff0c;都是STM32中的一个外设。串口是用来发送通信数据的&#xff0c;而DMA则是用来把数据从一个地方搬到另一个地方&#xff0c;而且不占用CPU。…

Arthas排查工具

简介 | arthas (aliyun.com) 在线安装 #下载jar包 curl -O https://arthas.aliyun.com/arthas-boot.jar#启动会先检测虚拟机进程&#xff0c;如果没有启动失败(idea) java -jar arthas-boot.jar linux安装与window一样

利用SOCKS5代理和代理IP提升网络安全与匿名性

一、引言 随着网络技术的迅猛发展&#xff0c;数据安全和隐私保护已成为业界关注的热点。企业和个人用户越来越依赖于各种网络技术来保护敏感信息免受未授权访问。本文将探讨SOCKS5代理、代理IP以及HTTP协议在提升网络安全和匿名性方面的作用和实践应用。 二、基础技术概述 2.…

flask毕业设计选题管理系统python+django_96r19

本系统选择编程语言。Pymysql是封装了MySQL驱动的Python驱动一个能使Python连接到MySQL的库。Python语言官方规范访问数据库的统一接口规范(Python DB-API)&#xff0c;防止在使用不同数据库时&#xff0c;由于底层数据库技术不同造成接口程序紊乱的问题。通过本次系统设计可以…

【Spring高级】Spring Boot启动过程

目录 SpringApplication new 分析源码分析步骤演示primarySources和Sources应用类型webApplicationTypesetInitializers设置容器初始化器setListeners设置监听器主类推断 SpringApplication run 分析主要步骤步骤演示事件发布容器相关执行 runner准备EnvironmentEnvironmentPos…

时间序列分析 #ARMA模型的识别与参数估计 #R语言

掌握ARMA模型的识别和参数估计。 原始数据在文末&#xff01;&#xff01;&#xff01; 练习1、 根据某1915-2004年澳大利亚每年与枪支有关的凶杀案死亡率&#xff08;每10万人&#xff09;数据&#xff08;题目1数据.txt&#xff09;&#xff0c;求&#xff1a; 第1小题&…

C# Solidworks二次开发:模型中实体Entity相关操作API详解

大家好&#xff0c;今天要讲的一些API是关于实体的相关API。 在开发的过程&#xff0c;很多地方会涉及到实体的相关操作&#xff0c;比如通过实体选中节点。下面就直接开始介绍API&#xff1a; &#xff08;1&#xff09;第一个API为Select4&#xff0c;这个API的含义为选中一…