| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
为什么自己写的堆排序超出内存??#include <stdio.h>
int n1,n2,n;
enum{
MAX=5000001,
};
int data[MAX];
void HeapAdjust_MAX(int n,int target)
{
int nChild;
int nTemp;
nTemp = data[target];
while(2 * target <= n)
{
nChild = 2 * target;
if(nChild + 1 <= n && data[nChild] < data[nChild + 1])
{
nChild++;//指向较大的孩子节点
}
if(nTemp < data[nChild])
{
data[target] = data[nChild];
target = nChild;
}
else break;
}
data[target] = nTemp;
}
void HeapAdjust_MIN(int n,int target)
{
int nChild;
int nTemp;
nTemp = data[target];
while(2 * target <= n)
{
nChild = 2 * target;
if(nChild + 1 <= n && data[nChild] > data[nChild + 1])
{
nChild++;
}
if(nTemp > data[nChild])
{
data[target] = data[nChild];
target = nChild;
}
else break;
}
data[target] = nTemp;
}
int tmp;
static void inline swap(int x,int y)
{
tmp = data[x];
data[x] = data[y];
data[y] = tmp;
}
void HeapSort_MAX(int n,int cnt)
{
int i;
//先对队列进行大顶堆排序
for(i = n/2;i >= 1;--i)
HeapAdjust_MAX(n,i);
for(i = n;i >= n - cnt;--i)
{
swap(i,1);
HeapAdjust_MAX(i - 1,1);
}
}
void HeapSort_MIN(int n,int cnt)
{
int i;
for(i = n/2;i >= 1;--i)
HeapAdjust_MIN(n,i);
for(i = n;i >= n - cnt;--i)
{
swap(i,1);
HeapAdjust_MIN(i - 1,1);
}
}
int main()
{
int i;
double ans;
long long sum;
freopen("input","r",stdin);
while(scanf("%d %d %d",&n1,&n2,&n))
{
sum = 0;
if(n1 == 0 || n2 == 0 || n == 0) break;
for(i = 1;i <= n;++i)
{
scanf("%d",&data[i]);
sum += data[i];
}
HeapSort_MAX(n,n1);//按大顶堆,队列后部分有序
HeapSort_MIN(n - n1,n2);
for(i = n;i > n - n1 -n2;--i)
sum -= data[i];
ans = (sum * 1.0)/(double)(n - n1 - n2);
printf("%f\n",ans);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator