当前位置: 首页 > wzjs >正文

创立网站做电商前端做网站直播

创立网站做电商,前端做网站直播,网站设计师发展方向,台州网站建设方案优化欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之分治-快排 发布时间:2025.4.15 隶属专栏:算法 目录 算法介绍核心步骤优化策略 例题颜色分类题目链接题目描述算法思路代码实现 排序数组题目链接题目描述算法思路代码实现 数组中的…

欢迎拜访:雾里看山-CSDN博客
本篇主题:算法思想之分治-快排
发布时间:2025.4.15
隶属专栏:算法

在这里插入图片描述

目录

  • 算法介绍
    • 核心步骤
    • 优化策略
  • 例题
    • 颜色分类
      • 题目链接
      • 题目描述
      • 算法思路
      • 代码实现
    • 排序数组
      • 题目链接
      • 题目描述
      • 算法思路
      • 代码实现
    • 数组中的第K个最大元素
      • 题目链接
      • 题目描述
      • 算法思路
      • 代码实现
    • 库存管理 III
      • 题目链接
      • 题目描述
      • 算法思路
      • 代码实现

算法介绍

快速排序(Quick Sort)是一种基于分治思想的高效排序算法,由 Tony Hoare 在 1960 年提出。其核心思想是通过“分区操作”将数组拆分为独立的两部分或者三部分,再递归处理子数组,最终完成整体排序。

核心步骤

  1. 选择基准(Pivot)
    从待排序数组中选择一个元素作为基准(通常选首/尾/中间元素或随机选择)。
  2. 分区(Partitioning)
    将数组重新排列,使得所有小于基准的元素位于其左侧,大于基准的位于右侧,基准到达最终正确位置。
  3. 递归排序
    对基准左侧和右侧的子数组递归执行上述操作。

优化策略

  1. 随机化基准选择
    避免最坏情况,提升鲁棒性。
  2. 三数取中法(Median-of-Three)
    选择首、中、尾三元素的中位数作为基准,减少不平衡分区。
  3. 小数组切换插入排序
    当子数组长度较小时(如 ≤ 15),使用插入排序更高效。

例题

颜色分类

题目链接

75. 颜色分类

题目描述

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 012 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例 1

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例 2

输入:nums = [2,0,1]
输出:[0,1,2]

提示

  • n == nums.length
  • 1 <= n <= 300
    >- nums[i] 012
    进阶
    你能想出一个仅使用常数空间的一趟扫描算法吗?

算法思路

类比数组分两块的算法思想,这里是将数组分成三块,那么我们可以再添加一个指针,实现数组分三块。
设数组大小为 n ,定义三个指针 left, cur, right :

  • left :用来标记 0 序列的末尾,因此初始化为 -1
  • cur :用来扫描数组,初始化为 0
  • right :用来标记 2 序列的起始位置,因此初始化为 n

cur 往后扫描的过程中,保证:

  • [0, left] 内的元素都是 0
  • [left + 1, cur - 1] 内的元素都是 1
  • [cur, right - 1] 内的元素是待定元素;
  • [right, n] 内的元素都是 2

代码实现

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

在这里插入图片描述

排序数组

题目链接

912. 排序数组

题目描述

给你一个整数数组 nums,请你将该数组升序排列。

你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。

示例 1

输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

提示

  • 1 <= nums.length <= 5 * 104
  • -5 * 104 <= nums[i] <= 5 * 104

算法思路

我们在数据结构阶段学习的快速排序的思想可以知道,快排最核心的一步就是 Partition (分割数据):将数据按照一个标准,分成左右两部分。

如果我们使用荷兰国旗问题的思想,将数组划分为 左 中 右 三部分:

左边是比基准元素小的数据,中间是与基准元素相同的数据,右边是比基准元素大的数据。然后再去递归的排序左边部分和右边部分即可(可以舍去大量的中间部分)。

在处理数据量有很多重复的情况下,效率会大大提升。

代码实现

class Solution {
public:vector<int> sortArray(vector<int>& nums) {srand(time(nullptr));// 种下随机数种子qsort(nums, 0, nums.size()-1);return nums;}void qsort(vector<int> &nums, int l, int r){if(l >= r)return ;int key = GetRandom(nums, l, r);int left = l-1, i = l, right = r+1;while(i < right){if(nums[i] < key)swap(nums[++left], nums[i++]);else if(nums[i] == key)i++;elseswap(nums[--right],nums[i]);}qsort(nums, l, left);qsort(nums, right, r);}int GetRandom(vector<int> &nums, int l, int r){int i = rand();return nums[i%(r-l+1) + l];}
};

在这里插入图片描述

数组中的第K个最大元素

题目链接

215. 数组中的第K个最大元素

题目描述

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

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

提示

  • 1 <= k <= nums.length <= 105
  • -104 <= nums[i] <= 104

算法思路

在快排中,当我们把数组分成三块之后: [l, left] [left + 1, right - 1] [right, r] ,我们可以通过计算每一个区间内元素的个数,进而推断出我们要找的元素是在哪一个区间里面。

那么我们可以直接去相应的区间去寻找最终结果就好了。

代码实现

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {srand(time(nullptr));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];int key = GetRandom(nums, l, r);int left = l-1, i = l, 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]);}if(r-right+1  >= k)return qsort(nums, right, r, k);else if(r-left >= k)return key; else return qsort(nums, l, left, k-(r-left));}int GetRandom(vector<int>nums, int l, int r){int i = rand();return nums[i%(r-l+1) + l];}
};

在这里插入图片描述

库存管理 III

题目链接

LCR 159. 库存管理 III

题目描述

仓库管理员以数组 stock 形式记录商品库存表,其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量,返回 顺序不限

示例 1

输入:stock = [2,5,7,4], cnt = 1
输出:[2]

示例 2

输入:stock = [0,2,3,6], cnt = 2
输出:[0,2] 或 [2,0]
提示

  • 0 <= cnt <= stock.length <= 10000
  • 0 <= stock[i] <= 10000

算法思路

在快排中,当我们把数组分成三块之后: [l, left] [left + 1, right - 1] [right, r] ,我们可以通过计算每一个区间内元素的个数,进而推断出我们要找的元素是在哪一个区间里面。

那么我们可以直接去相应的区间去寻找最终结果就好了。

代码实现

class Solution {
public:vector<int> inventoryManagement(vector<int>& stock, int cnt) {srand(time(nullptr));qsort(stock, 0, stock.size()-1, cnt);return {stock.begin(), stock.begin()+cnt};}void qsort(vector<int> &nums, int l, int r, int k){if(l >= r)return ;int key = GetRandom(nums, l, r);int left = l-1, i = l, 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]);}if(left-l+1  > k)qsort(nums, l, left, k);else if(right-l >= k)return ; else qsort(nums, right, r, k-(right-l));}int GetRandom(vector<int>nums, int l, int r){int i = rand();return nums[i%(r-l+1) + l];}
};

在这里插入图片描述

⚠️ 写在最后:以上内容是我在学习以后得一些总结和概括,如有错误或者需要补充的地方欢迎各位大佬评论或者私信我交流!!!


文章转载自:

http://CGU9sY6X.xbmwm.cn
http://sZGdBlqO.xbmwm.cn
http://sfSKuQ79.xbmwm.cn
http://emQwNJ2b.xbmwm.cn
http://qCQvp7Fb.xbmwm.cn
http://5bTWCFZj.xbmwm.cn
http://GsIb1eKg.xbmwm.cn
http://VzlqyBSk.xbmwm.cn
http://O7ZztSJa.xbmwm.cn
http://8LTkzL2E.xbmwm.cn
http://xT2h5DzC.xbmwm.cn
http://m0yCGaLC.xbmwm.cn
http://drYcaiW5.xbmwm.cn
http://tehghQAX.xbmwm.cn
http://GgifrW3E.xbmwm.cn
http://dEb9biVN.xbmwm.cn
http://rOiOSWnX.xbmwm.cn
http://hMHiNjOh.xbmwm.cn
http://mBIR8C6G.xbmwm.cn
http://JuD3nscH.xbmwm.cn
http://fTChBklf.xbmwm.cn
http://pRgQOEE3.xbmwm.cn
http://sEcMoIej.xbmwm.cn
http://8jSRbFEb.xbmwm.cn
http://dnbGyzzh.xbmwm.cn
http://Ej9ZqPCn.xbmwm.cn
http://BXI72z4J.xbmwm.cn
http://0t6snHjO.xbmwm.cn
http://plpCTUWP.xbmwm.cn
http://9JpZhj24.xbmwm.cn
http://www.dtcms.com/wzjs/693189.html

相关文章:

  • 做网站建设的网站天津建站服务
  • 学网站开发工作好找吗网站 如何做后台维护
  • 公司的网站建设价格低手机网站建设公司推荐
  • 关于网站建设领导分工北京高端网站建设有限公司
  • 网站开发可以用哪些语言简单做图网站
  • 制作购物网站需要多少钱成都网站快速排名软件
  • 网站毕业设计任务书外贸网站设计制作优化推广
  • 网站开发学习方法北京住房投资建设中心网站首
  • 网站系统设计目标wordpress插件 收费下载资源
  • html5 网站模板 米交通信用网站建设
  • 伴奏网站防盗是怎么做的销售网站开发
  • 通化网站建设公司做网站商业欺骗赔多少
  • 做微课的网站有哪些方面wordpress 5.2.2安装要求
  • 两学一做网站飘窗网站建设400电话
  • 中国建设银行青浦支行网站软件工程师级别
  • 哪些网站是做快消品的网站 关键字
  • 专业做网站登录asp.net 做网站
  • 微信小程序在哪里制作河南seo
  • 网站建设大全厦门 建网站
  • 衣服网站建设规划书it运维服务
  • html购物网站怎么做网络架构图用什么软件画
  • 兰州网站seo外包怎么样建立自己的网站
  • 网站建设方案及报价单哪里有整站优化
  • 区块链开发教程宁波seo推广公司排名
  • 上海松一网站建设绝对域名做网站
  • 只做鞋子的网站免费编程网站
  • 自己做的网站怎么改背景图wordpress链接提交
  • 网站排名优化和竞价赤峰市网站建设
  • 做网站链接怎么做怎么创建自己的网站平台
  • asp 个人网站上海高端建站网站