寻找第K大O(n)解法(快排+二分)

寻找第K大

http://www.nowcoder.com/questionTerminal/e016ad9b7f0b45048c58a9f27ba618bf

最近面试东京株式会社遇到这个题,特地来刷一下。
思路:
快排+二分,与快排不同的是,利用二分法每次都减少了一半的不必要排序。
当high=low小于k的时候,在后半部分搜索,
当high=low大于k的时候,在前半部分搜索。

代码:

# -*- coding:utf-8 -*-
import sys
def findKth(a, start, end, K):
    low, high = start, end
    key = a[start]
    while start < end:
        while start < end and a[end] <= key:
            end-=1
        a[start] = a[end]
        while start < end and a[start] >= key:
            start+=1
        a[end] = a[start]
    a[start] = key
    if start < K-1:
        return findKth(a, start+1, high, K)
    elif start > K-1:
        return findKth(a, low, start-1, K)
    else:
        return a[start]

try:
    while(1):
        line=sys.stdin.readline()
        if line=='': break
        lines = line.strip().replace('[','').replace(']','').split(',')
        lines = list(map(int,lines))
        n, K = lines[-2], lines[-1]
        val = findKth(lines, 0, n-1, K)
        print(val)
except:
    pass

麻豆出品,必出精品!

全部评论
麻豆好评
2 回复 分享
发布于 2020-09-20 23:43
能做到O(n),但你这个代码不是,最坏n方了。O(n)需要随机化,key = a[start]改为随机下标就行了,期望就是O(n)的了
1 回复 分享
发布于 2021-07-15 16:46
想不到麻豆的程序⚪这么牛皮
1 回复 分享
发布于 2021-06-28 16:57
麻豆可还行
点赞 回复 分享
发布于 2021-10-26 22:20
确实比快排少了一半,可怎么就是O(n)了?
点赞 回复 分享
发布于 2021-09-21 10:01
麻豆不辍
点赞 回复 分享
发布于 2021-02-17 23:33
请问为什么是O(n)复杂度呢
点赞 回复 分享
发布于 2020-12-06 20:54
ID不错
点赞 回复 分享
发布于 2020-09-19 10:32
QAQ好神奇
点赞 回复 分享
发布于 2020-09-05 21:33

相关推荐

面向对象的火龙果很爱...:去吃一顿炸鸡就走
点赞 评论 收藏
分享
水墨不写bug:疑似没有上过大学
点赞 评论 收藏
分享
05-11 20:45
门头沟学院 Java
有担当的灰太狼又在摸...:零帧起手查看图片
点赞 评论 收藏
分享
评论
32
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务