数组,寻找第K大的数
2024-09-30 17:44:32
思路解析(代码有问题)
1.最暴力的思想,直接排序,然后索引第k个数据,最优的排序算法时间复杂度为O(nlog(n)),但是随着n的变大,复杂度增长
2.借助快速排序的思想
快速排序的思想是通过一趟排序将要排序的list分为2部分,左边小,右边大。然后递归排序左右。我们可以在每一趟排序后,比较基准元素的索引和K的大小,若k大于基准元素的索引,则要寻找的k大数字就在基准元素的右边,否则左边。知道找到基准元素的索引等于K。
时间复杂度 O(n)
def partition(data,left,right):
if (len(data)<=0 or left<0 or right>=len(data)):
print("Invalid parametres,please check!")
#基准元素为list的第一个元素
temp = data[left]
i = left
j = right
while (i != j):
#两个指针,先动右边的指针,判断指针指向的元素是否小于基准元素,若小于,就要交换位置,移动到左边
while (data[j]>=temp and i<j):
j = j-1
while (data[i]<=temp and i<j):
i = i+1
if (i<j):
#data[i]与data[j]位置交换
t = data[i]
data[j] = data[i]
data[j] = t
#当i=j时,这时候list[i]=基准元素 data[i] = temp
return i def find_k(data,k):
n = len(data)
left = 0
right = n-1
index = partition(data,left,right)
while (index != k):
if (index>k):
right = index-1
index = partition(data,left,right)
else:
left = index+1
index = partition(data,left,right) return data[k] if __name__ == "__main__":
data = [6,9,2,4,5,7,9,3,4]
a = 2
k = len(data) -a
result = find_k(data,k)
print(result)
最新文章
- jQuery 3.0 的 Data 浅析
- Neo4j 3.0 存储过程
- c语言数据结构之 插入排序
- CAT XQX ---- 增删改查架构说明 1
- Android 开机默认横竖屏
- [LeetCode] 303. Range Sum Query - Immutable (Easy)
- java虚拟机内存分析
- java设计模式--创建模式--原型模式
- c#取出LDAP SearchResult所有属性
- 算法笔记_066:Kruskal算法详解(Java)
- Scrum笔记
- 普通PC通过USB转485串口 ModBus-RTU通信协议控制伺服电机
- mac环境使用ATS验证
- java----堆区、方法区和栈区
- MySQL 变量类型
- 15适配器模式Adapter
- 20155208实验二 Java面向对象程序设计
- Hive 组内计无重复数,追加每条记录后面
- JS获取鼠标左(右)滑事件
- Django开发Web监控工具-pyDash
热门文章
- YTU 2553: 谁是赢家
- JavaScript 在浏览器环境中的模块管理
- 如何将Eclipse中的项目迁移到Android Studio中
- codeforces 686B B. Little Robber Girl&#39;s Zoo(水题)
- python-----从本地摄像头和网络摄像头截取图片
- html/html5中的download属性
- 使用AngelaSmith.产生测试数据
- Codeforces 938D Buy a Ticket 【spfa优化】
- typedef struct和struct 的区别 用途
- python之对堆栈、队列处理操作(转载+个人看法)