问题描述:在长度为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)