C# 未排序数组中第 k 个最小/最大元素 预期线性时间 如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。未排序数组中第 k 个最小/最大元素 预期线性时间(K’th Smallest/Largest Element in Unsorted Array | Expected Linear Time)给定一个由不同整数组成的数组和一个整数 k其中 k 小于数组的大小任务是找到数组中第k小的元素。例如输入arr [7, 10, 4, 3, 20, 15] k 3输出7解释排序后的数组为 [3, 4, 7, 10, 15, 20]因此第三小的元素是 7。输入arr [7, 10, 4, 3, 20, 15] k 4输出10解释排序后的数组为 [3, 4, 7, 10, 15, 20]因此第 4 小的元素是 10。请注意解决“无序数组中最小/最大元素”问题有多种方法。本文讨论的方案在实践中效果最佳。无序数组中最小/最大元素C 第k个最小元素 C 第k个最小元素(K’th Smallest Element)-CSDN博客C# 第k个最小元素 C# 第k个最小元素(K’th Smallest Element)-CSDN博客Java 第k个最小元素 Java 第k个最小元素(K’th Smallest Element)-CSDN博客Python 第k个最小元素 Python 第k个最小元素(K’th Smallest Element)-CSDN博客JavaScript 第k个最小元素 JavaScript 第k个最小元素(K’th Smallest Element)-CSDN博客其思路是使用随机枢轴选择来划分数组通过专注于第 k 个元素所在的子数组来缩小搜索空间。循序渐进的方法随机选择枢轴元素随机选择一个元素作为枢轴元素。这有助于避免某些情况下的最坏情况例如数组已排序时。分区重新排列数组使所有小于枢轴元素的元素位于左侧所有大于枢轴元素的元素位于右侧。递归搜索枢轴元素确定位置后如果其索引与第 n 次比较相等则它是第 K 个大元素。否则根据与第 n 次-k 比较的结果递归地在相应的分区左侧或右侧中搜索-k。// C# program to find K’th Smallest/// Largest Element in Unsorted Arrayusing System;class GfG {// Partition function: Rearranges elements// around a pivot (last element)static int partition(int[] arr, int l, int r) {int x arr[r];int i l;// Iterate through the subarrayfor (int j l; j r - 1; j) {// Move elements pivot to the left partitionif (arr[j] x) {int temp arr[i];arr[i] arr[j];arr[j] temp;i;}}// Place the pivot in its correct positionint temp2 arr[i];arr[i] arr[r];arr[r] temp2;return i;}// Randomizes the pivot to avoid worst-case performancestatic int randomPartition(int[] arr, int l, int r) {Random rand new Random();int n r - l 1;int pivot rand.Next(n);int temp arr[l pivot];arr[l pivot] arr[r];arr[r] temp;return partition(arr, l, r);}// function to find the kth smallest element using QuickSelectstatic int quickSelect(int[] arr, int l, int r, int k) {// Check if k is within the valid range of the// current subarrayif (k 0 k r - l 1) {// Partition the array and get the pivots// final positionint pos randomPartition(arr, l, r);// If pivot is the kth element, return itif (pos - l k - 1)return arr[pos];// If pivots position is larger than k, search// left subarrayif (pos - l k - 1)return quickSelect(arr, l, pos - 1, k);// Otherwise, search right subarray and adjust k// (k is reduced by the size of the left partition)return quickSelect(arr, pos 1, r, k - (pos - l 1));}// Return infinity for invalid k (error handling)return int.MaxValue;}static int kthSmallest(int[] arr, int k) {int n arr.Length;return quickSelect(arr, 0, n - 1, k);}static void Main() {int[] arr {12, 3, 5, 7, 4, 19, 26};int k 3;Console.WriteLine(kthSmallest(arr, k));}}输出5时间复杂度O(n)。上述解决方案的最坏情况时间复杂度仍然是 O(n² )。在最坏情况下随机函数可能总是选择一个角点元素。然而平均情况时间复杂度为 O(n²) O(n)。分析中的假设是随机数生成器生成输入范围内任意数字的概率均等。辅助空间O(1)因为使用了常量变量。即使最坏情况下的时间复杂度是二次方的但这种解决方案在实践中效果最佳。如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。

相关新闻

最新新闻

Spring Boot集成AI服务:构建可观测、可容错、成本可控的工程实践

Spring Boot集成AI服务:构建可观测、可容错、成本可控的工程实践

在实际技术项目中,AI工具和框架的集成已经从一个“要不要用”的选择题,变成了一个“如何高效、安全、可控地用”的工程实践题。许多开发者对AI模型的黑盒性、数据隐私、成本不可控和调试困难抱有疑虑,但同时又无法否认其在代码生成、日志分析…

2026/9/1 20:57:31
货拉拉Java笔试真题解析:校招Java基础与算法备考指南

货拉拉Java笔试真题解析:校招Java基础与算法备考指南

1. 这份笔试题到底想筛什么样的人货拉拉2018秋招Java工程师笔试题卷一(B),我看到这个标题的瞬间,脑子里闪过的第一个念头是:这又是一份典型的“基础为王”的校招卷子。虽然具体题目我没有逐字背下来,但这种…

2026/9/1 20:57:31
Omarchy 新增 arm64 原生支持:Codex CLI 架构选型与配置指南

Omarchy 新增 arm64 原生支持:Codex CLI 架构选型与配置指南

这次我们来看一个 Codex 生态里很实用的更新:omarchy 客户端新增了 arm64 原生支持。如果你手里的设备是 Apple Silicon、Windows on ARM 或者 ARM64 Linux,之前跑 Codex 桌面客户端要么靠转译、要么干脆不兼容,现在这个更新直接把门槛降下来…

2026/9/1 20:57:31
Grok 4.6 实战指南:基于 CursorBench 评测的 AI 编程助手接入与应用

Grok 4.6 实战指南:基于 CursorBench 评测的 AI 编程助手接入与应用

大家好,我是专注于前沿技术分享的博主。最近,AI 编程助手领域又迎来了一波新的浪潮,Grok 4.6 在权威的 CursorBench 3.2 评测中登顶,并且其使用成本相较同类产品更具优势,这无疑为开发者们提供了一个新的、高性价比的选…

2026/9/1 20:57:31
STM32F103与INA219电流检测方案:从寄存器配置到实战避坑指南

STM32F103与INA219电流检测方案:从寄存器配置到实战避坑指南

简介:本资源是面向全国大学生电子设计竞赛(电赛)参赛者与嵌入式初学者的STM32F103INA219高精度电流检测实战项目,聚焦解决嵌入式系统中微弱电流信号易受噪声干扰、原始采样值波动大、测量稳定性不足等典型问题。项目完整实现基于I…

2026/9/1 20:57:31
【好靶场】SQL 注入-布尔盲注

【好靶场】SQL 注入-布尔盲注

【好靶场】SQL 注入-布尔盲注:使用 sqlmap 读取 Flag【好靶场】SQL 注入-布尔盲注一、题目分析二、确认接口和参数三、使用 SQLMap 检测注入四、枚举数据库五、枚举数据表六、枚举 flag 表字段七、导出 Flag八、漏洞原理九、修复建议1. 使用参数化查询2. 对 id 做类…

2026/9/1 20:52:31