思路解析(代码有问题)

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)

最新文章

  1. jQuery 3.0 的 Data 浅析
  2. Neo4j 3.0 存储过程
  3. c语言数据结构之 插入排序
  4. CAT XQX ---- 增删改查架构说明 1
  5. Android 开机默认横竖屏
  6. [LeetCode] 303. Range Sum Query - Immutable (Easy)
  7. java虚拟机内存分析
  8. java设计模式--创建模式--原型模式
  9. c#取出LDAP SearchResult所有属性
  10. 算法笔记_066:Kruskal算法详解(Java)
  11. Scrum笔记
  12. 普通PC通过USB转485串口 ModBus-RTU通信协议控制伺服电机
  13. mac环境使用ATS验证
  14. java----堆区、方法区和栈区
  15. MySQL 变量类型
  16. 15适配器模式Adapter
  17. 20155208实验二 Java面向对象程序设计
  18. Hive 组内计无重复数,追加每条记录后面
  19. JS获取鼠标左(右)滑事件
  20. Django开发Web监控工具-pyDash

热门文章

  1. YTU 2553: 谁是赢家
  2. JavaScript 在浏览器环境中的模块管理
  3. 如何将Eclipse中的项目迁移到Android Studio中
  4. codeforces 686B B. Little Robber Girl&#39;s Zoo(水题)
  5. python-----从本地摄像头和网络摄像头截取图片
  6. html/html5中的download属性
  7. 使用AngelaSmith.产生测试数据
  8. Codeforces 938D Buy a Ticket 【spfa优化】
  9. typedef struct和struct 的区别 用途
  10. python之对堆栈、队列处理操作(转载+个人看法)