题目:

所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。

解法1:堆排序

采用元素下沉法,维护一个k大小的最小堆,对于数组中的每一个元素判断与堆顶的大小,若堆顶较大,则不管,否则,弹出堆顶,将当前值插入到堆中,继续调整最小堆。时间复杂度O(n * logk)
注意:heap和array的关系;Find_heap_kth函数里面range的索引范围;

def heap_build(parent,heap):child = 2*parent+1while child<len(heap):if child+1<len(heap) and heap[child+1]<heap[child]:child = child+1if heap[parent]<= heap[child]:breakheap[parent],heap[child] = heap[child],heap[parent]parent,child = child,2*child+1return heapdef Find_heap_kth(array,k):if k > len(array):return Noneheap = array[:k]for i in range(k,-1,-1):heap_build(i,heap)for j in range(k,len(array)):if array[j]>heap[0]:heap[0] = array[j]heap_build(0,heap)return heap[0]print(Find_heap_kth([2,1,4,3,5,9,8,0,1,3,2,5],6)) 

解法2:插入排序

由于是要找 k 个最大的数,所以没有必要对所有数进行完整的排序。每次只保留 k 个当前最大的数就可以,然后每次对新来的元素跟当前 k 个树中最小的数比较,新元素大的话则插入到数组中,否则跳过。循环结束后数组中最小的数即是我们要找到第 k 大的数。 时间复杂度 (n-k)logk

注意:嵌套for循环里面,比较的对象;以及range的范围

def Find_Kth_max(array,k):for i in range(1,k):for j in range(i,0,-1):if array[j] > array[j-1]:array[j],array[j-1] = array[j-1],array[j]else:passfor i in range(k,len(array)):if array[i] > array[k-1]:array[k-1] = array[i]for j in range(k-1,0,-1):if array[j] > array[j-1]:array[j],array[j-1] = array[j-1],array[j]else:passreturn array[k-1]print(Find_Kth_max([2,1,4,3,5,9,8,0,1,3,2,5],3))  

解法3: 利用快速排序的思想

从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
2. Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)

def partition(num, low, high):pivot = num[low]while (low < high):while (low < high and num[high] > pivot):high -= 1while (low < high and num[low] < pivot):low += 1num[low],num[high] = num[high],num[low]num[high] = pivotreturn high,numdef findkth(num,low,high,k):   #找到数组里第k个数index=(partition(num,low,high))[0]print((partition(num,low,high))[1])if index==k:return num[index]if index<k:return findkth(num,index+1,high,k)else:return findkth(num,low,index-1,k)print(findkth([6,1,3,9,2],0,len([6,1,3,9,2])-1,4))

总觉得这个快排实现的有点问题。。

解法四:利用选择排序的思路

选择排序:

在N个元素中进行第一轮遍历:获取最大的元素,将最大的元素和最后一位元素互换;

在N-1个元素中进行第二轮遍历:获取第二大的元素,将第二大的元素和倒数第二位元素互换;

......

遍历每一轮当前无序数组中的最大值,那我们只需要找K轮,就能找到第K大元素了

实现方法是:

def Select_MaxVal_Pos(arr,n):'''当前长度的数组中,遍历N个元素,获取最大的元素值,及元素所在位置:param arr:数组:param n: 遍历元素个数:return:'''MaxVal = arr[0]Pos = 0for i in range(1,n):if arr[i]>MaxVal:MaxVal = arr[i]Pos = ireturn MaxVal,Posdef Find_TopK(arr,k):n = len(arr)for i in range(n):MaxVal,Pos = Select_MaxVal_Pos(arr,n-i)arr[n-i-1],arr[Pos] = arr[Pos],arr[n-i-1] #将当前轮次找出的最大的元素和出去右边已经排好序的元素最近的位置互换if i+1 == k:  #因为i是从0开始的,所以第i+1轮找出的是第i大的元素print(MaxVal,Pos)Find_TopK([4,2,5,7,1,9,0,20,45,100],3)# 20  7

附加
1 求中位数实际上是第k大数的特例。
2 如果需要找出N个数中最大的K个不同的浮点数呢?比如,含有10个浮点数的数组(1.5,1.5,2.5,3.5,3.5,5,0,- 1.5,3.5)中最大的3个不同的浮点数是(5,3.5,2.5)。解答:上面的解法均适用
3 如果是找第k到第m(0<k<=m<=n)大的数呢?解答:如果把问题看做m-k+1个第k大问题,则前面解法均适用。

python:无序数组中寻找第K大的元素相关推荐

  1. 如何寻找无序数组中的第K大元素?

    如何寻找无序数组中的第K大元素? 有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素.比如给定的无序数组如下所示: 如果k=6,也就是要寻找第6大的元素,很显然,数组中第一大元素是24,第二 ...

  2. 无序数组中找第K大的数

    类快排算法 leetcode215 由于只要求找出第k大的数,没必要将数组中所有值都排序. 典型解法:快速排序分组. 在数组中找到第k大的元素 取基准元素,将元素分为两个集合,一个集合元素比基准小,另 ...

  3. 趣解面试高频算法难题:数组中的第K个最大元素

    第二天,在另一家公司-- 小灰是吧?请简单介绍一下你自己. 好的,blah blah blah-- 下面考你一道算法题: 给你一个无序数组,要求你找出数组中的第k大元素. 题目是什么意思呢?比如给定的 ...

  4. 第k大的数python代码_Python实现查找数组中任意第k大的数字算法示例

    本文实例讲述了Python实现查找数组中任意第k大的数字算法.分享给大家供大家参考,具体如下: 模仿partion方法,当high=low小于k的时候,在后半部分搜索,当high=low大于k的时候, ...

  5. 【LeetCode】快排-无序整数数组中找第k大的数(或者最小的k个数)

    一个有代表性的题目:无序整数数组中找第k大的数,对快排进行优化. 这里先不说这个题目怎么解答,先仔细回顾回顾快排,掰开了揉碎了理解理解这个排序算法:时间复杂度.空间复杂度:什么情况下是复杂度最高的情况 ...

  6. 小米笔试题:无序数组中最小的k个数

    题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...

  7. 快速查找无序数组中的第K大数?

    1.题目分析: 查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN).在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高 ...

  8. 数组中的第K大元素问题(C++)

    数组中的第K大元素问题 问题: 在未排序的数组中找到第 k 个最大的元素.请注意,需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 约定: 假设这里数组的长度为 n. 方法一: ...

  9. 【算法】快速选择算法 ( 数组中找第 K 大元素 )

    算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...

最新文章

  1. GitHub怎样fork别人代码到自己仓库并进行贡献
  2. qPCR实验疑难杂问解答
  3. 检索数据_4_从表中查询部分列
  4. oracle存储过程id递增,oracle存储过程——按id更新相关信息
  5. php $表达式,PHP表达式概念及实例详解
  6. python int函数的实现_python实现int函数的案例分析
  7. UI_storyboard实现页面回调
  8. 批量创建文件夹的方法
  9. 金融工程第十一章BSM模型复习
  10. 心得-计算机软考之嵌入式系统工程师
  11. 长沙社区团购独角兽《兴盛优选》 18k 面试题记录,已拿offer!
  12. python操作jira修改status及写入comment
  13. Python基本数据类型之数字
  14. 那些惊艳了我的第三方插件收集
  15. 禁用键盘上的某些按键
  16. 前端表单提交方式大全
  17. [Reading]THIRD BASE
  18. Hbase预分区与优化
  19. root天猫,天猫盒子root
  20. 如何用c语言编辑一个象棋软件,C语言编写象棋软件源代码.doc

热门文章

  1. opencv 读取 16bit tif文件
  2. 【编程游戏】贺岁霓虹灯。(参观109楼dh20156的霓虹灯)
  3. Vasya And Array
  4. 180217 加密-专用加密软件(3)
  5. Flutter 之A value of type ‘‘ can‘t be assigned to a variable of type的错误解决笔记
  6. 如何批量将 Excel 文档转为 Csv 格式
  7. python计算两个向量夹角
  8. 详解win10任务视图快捷键是什么
  9. 动态建表格(来自https://www.cnblogs.com/mr-wuxiansheng/p/6363570.html)
  10. bootstrap时间选择器datetimepicker