第K小的数 快速排序 选择前K大O(n) 乱序数组中位数 median

2024-03-17 15:32

本文主要是介绍第K小的数 快速排序 选择前K大O(n) 乱序数组中位数 median,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

利用快速排序partition:

 

#include <iostream>
#include <map>
#include <algorithm>
#include <limits.h>
#include <assert.h>
using namespace std;
int selectK(int num[], int k, int left, int right) {assert(k <= (right - left + 1) && k >= 1);int mid = (left + right) / 2, i = left, j = right, pivot = num[mid];while (i <= j) {while (num[i] < pivot) {++i;}while (num[j] > pivot) {--j;}if (i <= j) {swap(num[i], num[j]);++i, --j;}}if (k == i - left && i - 1 == j + 1) {return pivot;}else if (k <= i - left) {return selectK(num, k, left, i-1);}else if (k > i - left) {return selectK(num, k - (i - left), i, right);}
}
int main() {int num[] = { 3, 2, 1, 4, 5, 6 };int res1 = selectK(num, 1, 0, 5);int res2 = selectK(num, 2, 0, 5);int res3 = selectK(num, 3, 0, 5);int res4 = selectK(num, 4, 0, 5);int res5 = selectK(num, 5, 0, 5);int res6 = selectK(num, 6, 0, 5);//int res6 = selectK(num, 6, 0, 4);return 0;
}

[l,i-1] <= pivot <= [j+1,r]

 

 

 

Python version:

from itertools import permutations#1. must confirm num[left, i-1] <= pivot <= num[j+1, right], that's why <= couldn't be replaced by < since it's impossible.
def selectKth(num, k, left, right):assert (k <= right-left+1 and k >= 1)mid = (left+right)//2i,j,pivot=left,right,num[mid]while (i <= j):     #2. must be <= instead of < since the returned condition required, otherwise, the recursive depth will be exceededwhile (num[i] < pivot): #3. must be < instead of <= since num[left, i-1] <= pivot <= num[j+1, right]i = i + 1while (num[j] > pivot): #3. must be > instead of >= since num[left, i-1] <= pivot <= num[j+1, right]j = j - 1if (i <= j):    #2. must be <= instead of < since the returned condition required, otherwise, the recursive depth will be exceedednum[i],num[j]=num[j],num[i]i,j = i+1,j-1#4. For num[left, i-1] <= pivot <= num[j+1, right], there're 2 cases for breaking the loop as the figure illustratedif (k == i-left and i-1==j+1 and pivot == num[i-1]):return pivotelif (k <= i-left):return selectKth(num, k, left, i-1)elif (k > i-left):return selectKth(num, k-(i-left), i, right)if __name__ == '__main__':perms = permutations([1,2,3,4,5,6], 6)for i in perms:for k in range(1, 7):perm = list(i)beforeSelect = list(i)kthNum = selectKth(perm, k, 0, 5)print("perm={0} k={1} kth={2}".format(beforeSelect, k, kthNum))assert (k == kthNum)

BTW, there's a O(n) method for selecting the first k numbers. Think over it!!!

from itertools import permutations# must confirm num[left, i-1] <= pivot <= num[j+1, right], that's why <= couldn't be replaced by < since it's impossible.def selectTopK(num, k, left, right):assert (k <= right - left + 1 and k >= 1)mid = (left + right) // 2i, j, pivot = left, right, num[mid]# must i <= j,while (i <= j):while (num[i] < pivot):i = i + 1while (num[j] > pivot):j = j - 1if (i <= j):num[i], num[j] = num[j], num[i]i, j = i + 1, j - 1# num[left, i-1] <= pivot <= num[j+1, right]if (k == i - left and i - 1 == j + 1 and pivot == num[i - 1]):return i - 1elif (k <= i - left):return selectTopK(num, k, left, i - 1)elif (k > i - left):return selectTopK(num, k - (i - left), i, right)if __name__ == '__main__':raw = [1, 2, 3, 1, 2, 3]rawlen = len(raw)perms = permutations(raw, rawlen)for i in perms:for k in range(1, rawlen+1):beforeSelect = list(i)kthIndex = selectTopK(beforeSelect, k, 0, rawlen-1)selectedTopK = beforeSelect[:kthIndex + 1]selectedTopK.sort()beforeSelect2 = list(i)beforeSelect2.sort()topK = beforeSelect2[:kthIndex + 1]print("perm={0} selected={1} topK={2}".format(beforeSelect, selectedTopK, topK))assert (topK == selectedTopK)

 

这篇关于第K小的数 快速排序 选择前K大O(n) 乱序数组中位数 median的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/819361

相关文章

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

exfat和ntfs哪个好? U盘格式化选择NTFS与exFAT的详细区别对比

《exfat和ntfs哪个好?U盘格式化选择NTFS与exFAT的详细区别对比》exFAT和NTFS是两种常见的文件系统,它们各自具有独特的优势和适用场景,以下是关于exFAT和NTFS的详细对比... 无论你是刚入手了内置 SSD 还是便携式移动硬盘或 U 盘,都需要先将它格式化成电脑或设备能够识别的「文

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的