线性时间内从一个数组中找出第K个最小的元素
2013-04-29 10:54
309 查看
/* 思路:用调优的快速排序,首先随机选择一个pivot对数组进行划分,左边小于pivot,右边大于等于pivot, 所以我们计算左边小于pivot(加上pivot)的个数count总共有多少, 如果等于k,正是我们所要的,返回x[k]; 如果大于k,说明第k小的数在左边,那就在左边进行我们的递归; 否则,在右边,那么说明右边的第k-count小的数就是我们所要的,在右边进行我们的递归。 这样的平均时间复杂度为O(N*logK),线性的、 */ #include <stdio.h> #include <stdlib.h> /*交换x[i]与x[j]的值*/ void swap(int x[],int i, int j) { int t = x[i]; x[i] = x[j]; x[j] = t; } /*生成一个在有效范围内的随机数*/ int randint(int l, int u) { return l + (RAND_MAX*rand() + rand()) % (u-l+1); } /*递归查找第K个最小值*/ int GetMinK(int x[],int l,int u,int k) { int i, j; int t, temp; if (l >= u) return 0; swap(x,l, randint(l, u)); t = x[l]; i = l; j = u+1; /*在左边找个比t小的,在右边找个比t大的,然后交换,一直到两个标识位i,j相交*/ for (;;) { do i++; while (i <= u && x[i] < t); do j--; while (x[j] > t); if (i > j) break; swap(x,i,j); } swap(x,l, j); if(j==k) return x[k]; else if (j < k) GetMinK(x,j+1, u, k); else if (j > k) GetMinK(x,l, j-1, k); } int main() { int x[]={2,12,11,1,5,10,9,7,8,6}; int k=3; printf("第%d小元素为:(从0开始)%d ",k,GetMinK(x,0,9,k)); return 0; }
相关文章推荐
- 线性时间内从一个数组中找出第K个最小的元素——编程珠玑
- 编写程序,在O(n)时间内从数组x[0..n-1]中找出第k个最小的元素?
- 在线性级别时间内找出无序序列中的第k个元素
- 整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?
- 用线性时间复杂度实现找出数组中出现一次的元素
- 用线性时间复杂度实现找出数组中出现一次的元素
- 用线性时间复杂度实现找出数组中出现一次的元素
- 用线性时间复杂度实现找出数组中出现一次的元素
- 用线性时间复杂度实现找出数组中出现一次的元素
- 找出数组中最小的k个元素
- 找出大数组array中第k大的元素(要求时间复杂度O(1))
- 面试题精选(79):取值为【1,n-1】含n个元素的整数数组至少存在一个重复数,O(n)时间内找出其中任意一个重复数
- 线性时间常数空间找到数组中数目超过n/5的所有元素
- 面试题精选(85):给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 找出旋转数组中最小的元素
- 找出数组中最小的k个元素
- 找出数组中第K个最小的数(快速排序)
- 剑指offer--找出旋转数组中的最小元素
- 找出数组中第k个元素
- 从一个数组中找出第k小元素的随机化算法 c语言实现 算法导论第九章