问题描述:在长度为n的序列中,找出其最大的K个数

1.冒泡排序

每冒泡一次,可将最大的数放到序列尾部,冒泡K次即可。

时间复杂度:O(K*n)

空间复杂度:O(1)

 

2.扫描数组,将最大的N个数存在缓存中,当有更大的数到来时替换缓存中的数

TOP_K(A,K)
    n = length of A
    create array T[K] = {-∞}
    t = 0

    for i = 0, n-1
    do
        if T[K-1] < A[i] then
            INSERT A[i] TO  SORTED ARRAY T[]

时间复杂度:O(n*K)

空间复杂度:O(K)

 

可以考虑用最小堆代替缓存数组存储最大的K个数,这样当A[i] 大于堆顶元素时,使用A[i]代替堆顶元素,然后调整堆,复杂度为 O(n*lgK)

 

3.堆排序,优先级队列

构造一个堆,从堆顶取出N个元素

时间复杂度: O(n+K*lgn)

空间复杂度: O(1)

 

 4.用选择法找出第K个元素,然后对前K个元素进行排序

 1 FIND_K( A ,K)
 2     n = length of A
 3     i = random index of n
 4     swap A[i] A[n-1]
 5     
 6     a = 0
 7     b = n-2
 8     while true
 9         while A[a] <= A[n-1]
10             a++
11         while A[b] >= A[n-1]
12             b++
13         if a>= b then break
14         swap A[a] A[b]
15     swap A[b] A[n-1]
16     
17     if b == K then return b
18     else if b > K then return FIND_K(A[0:b],K)
19     else return FIND_K(A[b:n],K-b)
20 
21 TOP_K(A,K)
22     p = FIND_K(A,K)
23     sort(A,0,p)

FIND_K的时间复杂度为O(n),则TOP_K的时间复杂度为 O(n + K*lgK)

 posted on 2014-07-15 19:39  stormli  阅读(234)  评论(0编辑  收藏  举报