通过划分的方式在线性时间内找出一个序列中第K大的元素
2013-10-26 19:44
435 查看
这种划分在快速排序中也用到了:
#py2.7 #coding:utf-8 import random def findkth(ll, k): if k > len(ll): raise Exception('Argument error') else: pivot = ll[random.randrange(0,len(ll))] last = 0 for i in range(1, len(ll)): if ll[i] >= pivot: last += 1 swap(ll, i, last) swap(ll, 0, last) print(ll,k) order = last+1 if order == k: return pivot elif order < k: return findkth(ll[last + 1:], k - order) else: return findkth(ll[0:last], k) def swap(ll, i, last): tmp = ll[i] ll[i] = ll[last] ll[last] = tmp ll = [1, 22, 31, 14, 0.5, 26, 17, 38, 19, 310] k = 3 print(findkth(ll, k))
相关文章推荐
- 通过划分的方式在线性时间内找出一个序列中第K大的元素
- [PY3]——找出一个序列中出现次数最多的元素/collections.Counter 类的用法
- 给一个由n-1个整数组成的未排序的序列,其元素都是1~n中的不同的整数。如何在线性时间复杂度内寻找序列中缺失的整数
- 面试题:n个整数的序列,其中一个整数重复次数超过一半,在O(n)时间内找出该整数
- 在线性级别时间内找出无序序列中的第k个元素
- 在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。
- 请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素
- 如何快速找出一个数组中只出现一次的两个数,其他元素出现两次?保证时间复杂度O(n),空间复杂度O(1)
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个
- 给你一个由n-1个整数组成的未排序的序列,其元素都是1到n中的不同的整数。请写出一个寻找序列中缺失整数的线性时间算法。
- 找出大数组array中第k大的元素(要求时间复杂度O(1))
- 有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。 给定一个int数组A和数组的大小n,请
- 设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。
- 选择问题:线性时间内找到序列的第k小的元素
- 求两个等长升序序列中每个序列取一个元素求和的第K小元素
- 整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?
- 设计一个栈,提供一个函数能够找出栈内最大的元素,时间复杂度为O(1)
- 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素。同时,栈的基本操作:入栈(Push)、出栈(Pop),也是在O(1)时间内完成的
- 取值为[1,n-1]含n个元素的整数数组,至少存在一个重复数,即可能存在多个重复数,O(n)时间内找出其中任意一个重复数,不使用额外存储空间。
- (2)单链表的操作 ① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数