第k个元素(模板)

//取第k个元素,k=0..n-1
//平均复杂度O(n)
//注意a[]中的顺序被改变

#define _cp(a,b) ((a)<(b))
typedef int elem_t;

elem_t kth_element(int n,elem_t* a,int k){
elem_t t,key;
int l=0,r=n-1,i,j;
while (l<r){
for (key=a[((i=l-1)+(j=r+1))>>1];i<j;){
for (j--;_cp(key,a[j]);j--);
for (i++;_cp(a[i],key);i++);
if (i<j) t=a[i],a[i]=a[j],a[j]=t;
}
if (k>j) l=j+1;
else r=j;
}
return a[k];

时间: 2024-12-25 08:57:43

第k个元素(模板)的相关文章

lintcode 中等题:kth-largest-element 第k大元素

题目 第k大元素 在数组中找到第k大的元素 样例 给出数组[9,3,2,4,8],第三大的元素是4 给出数组 [1,2,3,4,5],第一大的元素是5,第二大的元素是4,第三大的元素是3,以此类推 注意 你可以交换数组中的元素的位置 挑战 要求时间复杂度为O(n),空间复杂度为O(1) 解题 理论快速排序的思想,每次都减半,这个时间复杂度也是O(N),至于为什么就不知道了 class Solution { /* * @param k : description of k * @param num

用快速排序法寻找第k大元素

#include<iostream> #include<algorithm> #include<iterator> #include<cstdio> using namespace std; // 求首元素.中间元素和尾元素的中位数,将中位数与首元素交换位置 inline void medianAsPivot(int arr[], const int& left, const int& right) { const int middle =

算法题:找出一个数组中依次最大的k个元素

package arithmetic; import java.util.Arrays; /** * 找出一个数组中依次最大的k个元素 * @author SHI */ public class FindMaxFigure { public static void main(String[] args) { int[] a=new int[]{1,5,-1,8,0,2}; System.out.println(Arrays.toString(findBigFigure(a, 3))); } /*

每日算法之四十三:Rotate List (列表旋转k个元素)

Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL. 这里的k可能是比链表长度要大的数字,因此实际旋转的位置就是k%len(list).如果这个计算结果等于零或者等于len(list),

有序数组寻找中位数以及寻找K大元素

问题描述: 两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n)).转化成找到两个数组的第K大数字进行解决 解题方法: 对于一个长度为n的已排序数列a,若n为奇数,中位数为a[n / 2 + 1] , 若n为偶数,则中位数(a[n / 2] + a[n / 2 + 1]) / 2如果我们可以在两个数列中求出第K小的元素,便可以解决该问题不妨设数列A元素个数为n,数列B元素个数为m,各自升序排序,求第k小元素取A[k / 2] B[k / 2]

排序,求几个最值问题,输入n个整数,输出其中最小的k个元素。

看完两个求最大值算法之后的一些感想. 如果想直接看算法的可以跳过.但是我觉得我这些想法还是比较有用的,至少对我将来的算法设计是这样的. 算法的功能越强大,必然意味着速度慢,因为根据丛林法则,那种慢又功能少的算法会被淘汰. 所以,(注意了!!),如果我们在使用一个算法的时候感觉到它造成的结果满足我们的使用,而且超出了,我们的使用,那么我们就很可能浪费了时间,降低了效率. 例如这个1000个数中求最大的10个的算法: 如果排序,取前10个.发现后面的白排序了,根本没用到.参照加粗行,也许可以有更快的

寻找第K大元素的八大算法、源码及拓展

一.问题描述 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题. 第K大问题可以是现实问题,譬如竞价排名中的第K个排名,或者多个出价者中的第K大价格等等. 二.解法归纳 解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k). 很好理解,利用快排对所有元素进行排序,然后找到第K个元素即可. 解法2: 利用选择排序或交互排序,K次选择后即可得到第k大的数.总的时间复杂度为O(n*k)

vector中删除第k个元素的巧妙方法

假设我们定义了一个vector如下: vector<int> v;v.push_back(1);...v.push_back(255); 如果要删除第k个元素的话,应该这样写: (1)如果k是第0个 vector<int>(v.begin() + 1, v.end()).swap(v); (2)如果k是最后一个, v.pop_back(); (3)其他情况下 vector<int> v_c(v.begin() + k + 1, v.end()); v.resize(k)

堆的应用(1000个数据中找最大的前K个元素,堆排序)

(1)从1000个数据中找到k个最大数据 首先看到这个题时,可能会想到先将这1000个数据进行降序排序,即取出的前k个元素最大.时间复杂度为O(N^2),使得程序效率低. 如何解决这个问题呢?我们的堆就派上用场喽! 解题思路: 可先创建一个数组topK[k],将100w中的前k个数据放入数组topK中,将topK中的数据建小堆,则可保证堆的第一个元素是最小的,将第k个元素与堆中第一个元素比较,若大于,则交换.对堆进行重新建小堆,取第k+1个元素与堆中第一个元素比较,以此类推,直至100w-k个元