荣誉版主
- 积分
- -2403
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2010-5-4
- 最后登录
- 1970-1-1
|
这样复杂度就是O(K * N)
Imbalism 发表于 2011-9-24 13:39 
用大小为k+1的堆, 每次pop一个压入一个
- bool Pred(int a, int b)
- {
- return a > b;
- }
- void ReSort(int a[], int n, int k)
- {
- assert(a && n > 0 && k > 0 && k < n);
- int* pHeap = new int[k];
- for (int i = 0; i < k; i++)
- pHeap[i] = a[i];
- make_heap(pHeap, pHeap + k, Pred);
- for (int i = k; i < n; i++)
- {
- pop_heap(pHeap, pHeap+k, Pred);
- a[i-k] = pHeap[k-1];
- pHeap[k-1] = a[i];
- push_heap(pHeap, pHeap+k, Pred);
- }
- sort_heap(pHeap, pHeap+k, Pred);
- for (int j = k; j >= 1; j--)
- a[n - j] = pHeap[j - 1];
- delete []pHeap;
- }
复制代码 |
|