一:利用快速排序的思想,可以在O(n)的时间复杂度下解决问题,
为什么是O(n)呢,它是这么相加的n+n/2+n/4+n/8+...=2n所以是O(n),
这种方法会改变原数组的顺序。
二:另外还有一种nlong(k),特别适合处理海量数据
首先创建一个k大小的容器,这个容器建议使用二叉树,或者最大堆来实现,每次查找容器中最大数,删除最大数,插入新数。操作需要log(k)的时间。所以总的时间复杂度时nlong(k)。
二叉排序树,查找,删除,插入都是log(n)
堆,查找最大只需O(1),删除,插入都是log(n)
还有平衡二叉树,B+,B-树,红黑书,都是二叉排序树的变体,但是更稳定,平衡性更好。
第一种的详细解答如下:
给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素。
例 求数组第7小元素 A[1:9]=[65,70,75,80,85,60,55,50,45]partition[1:9]=[60,45,50,55,65,85,80,75,70] j=7 q=5
[6:9]=[85,80,75,70] j=2
partition[6:9]=[70,80,75,85] j=2 q=4
[6:8]=[70,80,75] j=2
partition[6:8]=[70,80,75] j=2 q=1
[7:8]=[80,75] j=1
int randomizedSelect(int *a, int L, int R, int k)
{
if (L == R) return a[L];
int i = randomizedpartition(L, R),
j = i – L + 1;
if (k < j)
return randomizedSelect(a, L, i - 1, k);
else
return randomizedSelect(a, i, R, k – j);
}
最坏时间复杂度: O(n2)
平均时间复杂度:O(n)