利用分治策略优化快速排序

1. 基本思想

    分治快速排序(Quick Sort)是一种基于分治法的排序算法,采用递归的方式将一个数组分割成小的子数组,并通过交换元素来使得每个子数组元素按照特定顺序排列,最终将整个数组排序。

快速排序的基本步骤:

  1. 选择基准元素:从数组中选择一个元素作为基准(pivot)。
  2. 分区操作:将数组分成两个部分,左边的部分所有元素都小于基准元素,右边的部分所有元素都大于基准元素。此时基准元素已经排好序。
  3. 递归排序:对基准元素左侧和右侧的子数组递归进行快速排序。

快速排序的核心思想:

  • 分治法:通过每次选择一个基准元素,将数组分割成两个子数组,然后递归地对两个子数组进行排序。
  • 每次选择基准元素后,通过分区将数组划分为两个部分,左侧部分的元素都小于基准,右侧部分的元素都大于基准。
  • 递归对子数组进行排序,直到每个子数组的长度为 1 或 0,排序完成。
// 分区函数,返回基准元素的正确位置
int Partition(vector<int>& arr, int low, int high) {int pivot = arr[high];  // 选择最后一个元素作为基准int i = low - 1;  // i 是小于基准元素的子数组的最后一个元素的索引// 遍历数组,将小于基准的元素移动到数组的前面for (int j = low; j < high; ++j) {if (arr[j] < pivot) {++i;swap(arr[i], arr[j]);}}// 将基准元素放到正确的位置swap(arr[i + 1], arr[high]);return i + 1;  // 返回基准元素的索引
}// 快速排序函数
void QuickSort(vector<int>& arr, int low, int high) {if (low < high) {// 找到基准元素的索引int pi = Partition(arr, low, high);// 递归排序基准元素左边和右边的子数组QuickSort(arr, low, pi - 1);  // 排序左边子数组QuickSort(arr, pi + 1, high); // 排序右边子数组}
}

 2. 快速选择算法

    快速选择算法(Quickselect) 是一种基于快速排序(Quick Sort)的算法,用于在未排序的数组中找到第 k 小(大)的元素。与快速排序不同,快速选择只对包含第 k 小(大)元素的部分进行排序,而不需要对整个数组进行排序,因此它的时间复杂度通常较低。

快速选择的核心思想是:

  1. 与快速排序一样,通过选择一个“基准”元素并进行分区(Partition)操作,将数组分成左右两个部分。
  2. 如果基准元素的位置正好是 k,则基准元素即为第 k 小的元素。
  3. 如果基准元素的位置小于 k,则继续在右侧子数组中查找第 k 小元素。
  4. 如果基准元素的位置大于 k,则继续在左侧子数组中查找第 k 小元素。

通过将数组分成三个部分:小于基准、等于基准、大于基准,从而更有效地找到第 k 小的元素。相较于传统的快速选择算法,使用三个部分分区可以加速查找过程,特别是在处理重复元素时。

下面是一个示例,这类问题可以以此为模板,通过适当修改来实现不同的目标。 

int qsort(vector<int>& nums, int l, int r, int k){if(l == r) return nums[l];//1.随机选择基准数int key = getRandom(nums, l, r);//2.根据基准数将数组分成三组int left = l - 1, right = r + 1, i = l;while(i < right){if(nums[i] < key) swap(nums[++left], nums[i++]);else if(nums[i] == key) i++;else swap(nums[--right], nums[i]); }//3.分情况讨论int c = r - right + 1, b = right - left - 1;if(c >= k)return qsort(nums, right, r, k);else if(b + c >= k) return key;else  return qsort(nums, l, left, k - b - c);}int getRandom(vector<int>& nums, int left, int right){int r = rand();return nums[r % (right - left) + left];}

3. 颜色分类

解法:三指针

排序时数组被分成四个部分,[0, left] 区间都是0,(left, i)区间都是1,[i, right]区间是未排序的部分,[right , n - 1]区间都是2.

排序完成后,i与right相等,数组被分成三个部分[0, left]都是1,(left, i)都是0,[right , n - 1]都是2

class Solution {
public:void sortColors(vector<int>& nums) {int i = 0, n = nums.size();int left = -1, right = n;while(i < right){if(nums[i] == 0) swap(nums[i++], nums[++left]);else if(nums[i] == 1) i++;else if(nums[i] == 2) swap(nums[i], nums[--right]);}}
};

75. 颜色分类 - 力扣(LeetCode)

4.  排序数组

使用将数组分成三部分的思想实现快排,效率会更高

class Solution {
public:vector<int> sortArray(vector<int>& nums) {srand(time(NULL));qsort(nums, 0, nums.size() - 1);return nums;}void qsort(vector<int>& nums, int l, int r){if(l >= r) return;int key = getRanNum(nums, l, r);//获取随机基准值int i = l, left = l - 1, right = r + 1;while(i < right){if(nums[i] < key) swap(nums[++left], nums[i++]);else if(nums[i] == key) i++;else swap(nums[--right], nums[i]);}qsort(nums, l, left);qsort(nums, right, r);}int getRanNum(vector<int>& nums, int left, int right){int r = rand();return nums[r % (right - left) + left];}
};

912. 排序数组 - 力扣(LeetCode)

5. 数组中第k个最大元素

快速选择算法

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {srand(time(NULL));return qsort(nums, 0, nums.size() - 1, k);}int qsort(vector<int>& nums, int l, int r, int k){if(l == r) return nums[l];//返回条件//1.随机选择基准数int key = getRandom(nums, l, r);//2.根据基准数将数组分成三组int left = l - 1, right = r + 1, i = l;while(i < right){if(nums[i] < key) swap(nums[++left], nums[i++]);else if(nums[i] == key) i++;else swap(nums[--right], nums[i]); }//3.分情况讨论int c = r - right + 1, b = right - left - 1;if(c >= k)return qsort(nums, right, r, k);else if(b + c >= k) return key;else  return qsort(nums, l, left, k - b - c);}int getRandom(vector<int>& nums, int left, int right){int r = rand();return nums[r % (right - left) + left];}
};

215. 数组中的第K个最大元素 - 力扣(LeetCode)

6. 库存管理

法一:排序 O(nlogn)

法二:堆排序 O(nlogk)

法三:快速选择算法 O(n)

class Solution {
public:vector<int> inventoryManagement(vector<int>& stock, int cnt) {srand(time(NULL));qsort(stock, 0, stock.size() - 1, cnt);return {stock.begin(), stock.begin() + cnt};}void qsort(vector<int>& stock,int l, int r, int cnt){if(l == r) return;//1.随机选择基准数int key = getRandom(stock, l, r);//2.根据基准数将数组分成三组int left = l - 1, right = r + 1, i = l;while(i < right){if(stock[i] < key) swap(stock[++left], stock[i++]);else if(stock[i] == key) i++;else swap(stock[--right], stock[i]); }//3.分情况讨论int a = left - l + 1, b = right - left - 1;if(cnt < a) qsort(stock, l, left, cnt);else if(cnt <= a + b) return;else qsort(stock, right, r, cnt - a - b);}int getRandom(vector<int>& stock, int left, int right){int r = rand();return stock[r % (right - left) + left];}
};

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

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

相关文章

从零到一实现微信小程序计划时钟:完整教程

在本教程中&#xff0c;我们将一起实现一个微信小程序——计划时钟。这个小程序的核心功能是帮助用户添加任务、设置任务的时间范围&#xff0c;并且能够删除和查看已添加的任务。通过以下步骤&#xff0c;我们将带你从零开始实现一个具有基本功能的微信小程序计划时钟。 项目…

idea日常报错之UTF-8不可映射的字符

目录 一、UTF-8不可映射的字符的解决 1、出现这种报错的情形 2、具体解决办法 前言&#xff1a; 在我们日常代码编写的时候可能会遇到各式各样的错误&#xff0c;有时候并不是你改动了代码&#xff0c;而是莫名其妙就出现的报错&#xff0c;今天我就遇到一个在maven编译的时候…

人工智能技术-基于长短期记忆(LSTM)网络在交通流量预测中的应用

人工智能技术-基于长短期记忆&#xff08;LSTM&#xff09;网络在交通流量预测中的应用 基于人工智能的智能交通管理系统 随着城市化进程的加快&#xff0c;交通问题日益严峻。为了解决交通拥堵、减少交通事故、提高交通管理效率&#xff0c;人工智能&#xff08;AI&#xff…

HTTP FTP SMTP TELNET 应用协议

1. 标准和非标准的应用协议 标准应用协议&#xff1a; 由标准化组织&#xff08;如 IETF&#xff0c;Internet Engineering Task Force&#xff09;制定和维护&#xff0c;具有广泛的通用性和互操作性。这些协议遵循严格的规范和标准&#xff0c;不同的实现之间可以很好地进行…

Matlab离线安装硬件支持包的方法

想安装支持树莓派的包&#xff0c;但是发现通过matlab安装需要续订维护服务 可以通过离线的方式安装。 1. 下载SupportSoftwareDownloader Support Software Downloader - MATLAB & Simulink 登录账号 选择对应的版本 2. 选择要安装的包 3.将下载的包copy到安装目录下 …

Django REST Framework (DRF) 中用于构建 API 视图类解析

Django REST Framework (DRF) 提供了丰富的视图类&#xff0c;用于构建 API 视图。这些视图类可以分为以下几类&#xff1a; 1. 基础视图类 这些是 DRF 中最基础的视图类&#xff0c;通常用于实现自定义逻辑。 常用类 APIView&#xff1a; 最基本的视图类&#xff0c;所有其…

MyBatis拦截器终极指南:从原理到企业级实战

在本篇文章中&#xff0c;我们将深入了解如何编写一个 MyBatis 拦截器&#xff0c;并通过一个示例来展示如何在执行数据库操作&#xff08;如插入或更新&#xff09;时&#xff0c;自动填充某些字段&#xff08;例如 createdBy 和 updatedBy&#xff09;信息。本文将详细讲解拦…

137,【4】 buuctf web [SCTF2019]Flag Shop

进入靶场 都点击看看 发现点击work会增加&#xffe5; 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT&#xff08;JSON Web Token&#xff09;字符串。JWT 通常由三部分组成&#xff0c;通过点&#xff08;.&#xff09;分隔&#xff0c;分别是头部&#xff08;Header&…

twisted实现MMORPG 游戏数据库操作封装设计与实现

在设计 MMORPG&#xff08;大规模多人在线角色扮演游戏&#xff09;时&#xff0c;数据库系统是游戏架构中至关重要的一部分。数据库不仅承担了游戏中各种数据&#xff08;如玩家数据、物品数据、游戏世界状态等&#xff09;的存储和管理任务&#xff0c;还必须高效地支持并发访…

【R语言】聚类分析

聚类分析是一种常用的无监督学习方法&#xff0c;是将所观测的事物或者指标进行分类的一种统计分析方法&#xff0c;其目的是通过辨认在某些特征上相似的事物&#xff0c;并将它们分成各种类别。R语言提供了多种聚类分析的方法和包。 方法优点缺点适用场景K-means计算效率高需…

超全Deepseek资料包,deepseek下载安装部署提示词及本地部署指南介绍

该资料包涵盖了DeepSeek模型的下载、安装、部署以及本地运行的详细指南&#xff0c;适合希望在本地环境中高效运行DeepSeek模型的用户。资料包不仅包括基础的安装步骤&#xff0c;还提供了68G多套独立部署视频教程教程&#xff0c;针对不同硬件配置的模型选择建议&#xff0c;以…

Java Spring boot 篇:常用注解

Configuration 作用 Configuration 注解的核心作用是把一个类标记为 Spring 应用上下文里的配置类。配置类就像一个 Java 版的 XML 配置文件&#xff0c;能够在其中定义 Bean 定义和 Bean 之间的依赖关系。当 Spring 容器启动时&#xff0c;会扫描这些配置类&#xff0c;解析其…

在 Ubuntu 20.04 为 Clash Verge AppImage 创建桌面图标教程

在 Ubuntu 20.04 为 AppImage 创建桌面图标教程 一、准备工作 确保你已经下载了 xxxx.AppImage 文件&#xff0c;并且知道它所在的具体路径。同时&#xff0c;你可以准备一个合适的图标文件&#xff08;.png 格式&#xff09;用于代表该应用程序&#xff0c;如果没有合适的图…

【复现DeepSeek-R1之Open R1实战】系列6:GRPO源码逐行深度解析(上)

目录 4 GRPO源码分析4.1 数据类 GRPOScriptArguments4.2 系统提示字符串 SYSTEM_PROMPT4.3 奖励函数4.3.1 accuracy_reward函数4.3.2 verify函数4.3.3 format_reward函数 4.4 将数据集格式化为对话形式4.5 初始化GRPO Trainer 【复现DeepSeek-R1之Open R1实战】系列3&#xff1…

【杂谈】加油!!!!

为了在三月底前系统准备Java后端开发的面试和笔试&#xff0c;以下是分阶段的高效学习计划&#xff1a; 一、知识体系构建&#xff08;第1-2周&#xff09; 核心基础强化 Java基础&#xff08;每日1.5小时&#xff09;&#xff1a; 重点掌握&#xff1a;JVM内存模型&#xff0…

python旅游推荐系统+爬虫+可视化(协同过滤算法)

✅️基于用户的协同过滤算法 ✅️有后台管理 ✅️2w多数据集 这个旅游数据分析推荐系统采用了Python语言、Django框架、MySQL数据库、requests库进行网络爬虫开发、机器学习中的协同过滤算法、ECharts数据可视化技术&#xff0c;以实现从网站抓取旅游数据、个性化推荐和直观展…

HarmonyNext上传用户相册图片到服务器

图片选择就不用说了&#xff0c;直接用 无须申请权限 。 上传图片&#xff0c;步骤和android对比稍微有点复杂&#xff0c;可能是为了安全性考虑&#xff0c;需要将图片先拷贝到缓存目录下面&#xff0c;然后再上传&#xff0c;当然你也可以转成Base64&#xff0c;然后和服务…

同为科技智能PDU助力Deepseek人工智能和数据交互的快速发展

1 2025开年&#xff0c;人工智能领域迎来了一场前所未有的变革。Deepseek成为代表“东方力量”的开年王炸&#xff0c;不仅在国内掀起了技术热潮&#xff0c;并且在全球范围内引起了高度关注。Deepseek以颠覆性技术突破和现象级应用场景席卷全球&#xff0c;这不仅重塑了产业格…

二、QEMU NFS 环境搭建

​ 在上一章节中&#xff0c;我们已经成功完成了内核和 busybox 环境的配置。为了进一步提高开发效率&#xff0c;我们可以使用 NFS&#xff08;Network File System&#xff09;来挂载根目录。NFS 允许我们将本地文件系统通过网络共享给虚拟机使用&#xff0c;这样在开发过程中…

.NET 9.0 的 Blazor Web App 项目中 EF Core 【事务】使用备忘

一、DbContext.Database.BeginTransactionAsync() 模式 1. 注意事项&#xff1a;连接字符串中启用了 MARS&#xff08;Multiple Active Result Sets&#xff1a;MultipleActiveResultSetsTrue &#xff09;后&#xff0c;无法创建 保存点&#xff08;保存点与 SQL Server 的多…