奇单网站建设,鞍山网上制作网站,专业的聊城网站建设,关键词排名规则最大堆即大根堆 -- 求前n小最小堆即小根堆 -- 求前n大比如求前n小#xff0c;对于当前元素#xff0c;和最大堆的堆顶元素#xff08;即堆最大值#xff09;比较#xff0c;如果小于堆顶元素#xff0c;则替换堆顶元素#xff0c;并调整堆。这样扫描一遍就可以得到最小的…最大堆即大根堆 -- 求前n小 最小堆即小根堆 -- 求前n大 比如求前n小对于当前元素和最大堆的堆顶元素即堆最大值比较如果小于堆顶元素则替换堆顶元素并调整堆。这样扫描一遍就可以得到最小的n个元素效率非常高。 问题实例 100w个数中找最大的前100个数 1 INT_MIN初始化最小堆 2 读入一个数如果大于堆顶元素则替换堆顶元素并调整堆 //base index 1#define LCHILD(i) (2*(i))#define RCHILD(i) (2*(i)1)enum { BIGHEAP0, SMALLHEAP1,};//Adjust the heaptemplate typename Tvoid HeapAdjust(T *heap, size_t n, bool flg){int i1; T root heap[1];while (in) { T ex;if (flg BIGHEAP) //最大堆 {if (LCHILD(i)n) { ex LCHILD(i);if (RCHILD(i)n heap[LCHILD(i)]heap[RCHILD(i)]) ex RCHILD(i); }elsebreak;if (heap[ex] root) { heap[i] heap[ex]; i ex; }elsebreak; }else //最小堆 {if (LCHILD(i)n) { ex LCHILD(i);if (RCHILD(i)n heap[LCHILD(i)]heap[RCHILD(i)]) ex RCHILD(i); }elsebreak;if (heap[ex] root) { heap[i] heap[ex]; i ex; }elsebreak; } } heap[i] root;}void FindNNumber(const char *file, size_t n, bool flg){int *heap new int[n1];int i;for (i1; in; i) {if (flg BIGHEAP) heap[i] INT_MAX;else heap[i] INT_MIN; } FILE *fp fopen(file, r);int a;while(fscanf(fp, %d, a)0) {if (flg BIGHEAP) {if (a heap[1]) heap[1] a; }else {if (a heap[1]) heap[1] a; } HeapAdjust(heap, n, flg); } fclose(fp);for (i1; in; i) printf(%d\n, heap[i]);}void main(){//最小的n个数 FindNNumber(temp.txt, 10, BIGHEAP); printf(\n\n);//最大的n个数 FindNNumber(tt.txt, 10, SMALLHEAP);}