#include
<
algorithm
>
//
本例程介绍了STL heap的用法,并将其封装到到一个优先队列类中
const
int
maxLen
=
100
;
template
<
class
T
>
#define
DEAP
//
浅复制还是深复制
struct
PQ
{
//
最大堆
T h[maxLen];
int
e;
void
clear()
{ e
=
0
;}
bool
empty()
{
return
e
==
0
; }
int
size()
{
return
e;}
void
push(
const
T
&
item)
{
//
O(logN)
h[e
++
]
=
item;
push_heap(h,h
+
e);
}
T
&
pop()
{
//
O(logN)
pop_heap(h,h
+
e);
return
h[
--
e];
}
const
T
&
top()
{
return
h[
0
];
}
void
make(T
*
bgn, T
*
end)
{
//
O(N)
#ifdef DEAP
//
深复制
for
(e
=
0
; bgn
!=
end;
++
e,
++
bgn)
h[e]
=*
bgn;
#else
//
浅复制
e
=
end
-
bgn;
memcpy(h,bgn,e
*
sizeof
(
*
bgn));
#endif
make_heap(h,h
+
e);
}
void
sort(T
*
bgn)
{
//
O(NlogN)
#ifdef DEAP
//
深复制
int
i; T
*
end
=
bgn;
for
(i
=
0
; i
<
e;
++
i,
++
end)
*
end
=
h[i];
#else
//
浅复制
T
*
end
=
bgn
+
e;
memcpy(bgn,h,e
*
sizeof
(
*
bgn));
#endif
sort_heap(bgn, end);
}
friend
bool
isHeap(T
*
bgn, T
*
end)
{
//
debug用, O(N)
T
*
h
=
bgn
-
1
;
int
i,e
=
end
-
bgn
+
1
;
for
(i
=
2
; i
<
e;
++
i)
if
(h[i
/
2
]
<
h[i])
return
false
;
return
true
;
}
PQ()
{ clear();}
}
;
#include
<
cassert
>
#include
<
iostream
>
using
namespace
std;
template
<
class
T
>
inline
void
show(T a[],
int
n)
{
int
i;
for
(i
=
0
; i
<
n;
++
i)
cout
<<
a[i]
<<
'
'
;
cout
<<
endl;
}
//
简单测试
int
main()
{
PQ
<
int
>
pq;
int
a[]
=
{
3
,
6
,
5
,
4
,
2
,
7
,
9
}
;
cout
<<
(pq.empty()
?
"
Empty\n
"
:
"
Not empty\n
"
);
pq.make(a,a
+
sizeof
(a)
/
sizeof
(
*
a));
show(pq.h,pq.size());
cout
<<
"
Top:
"
<<
pq.top()
<<
endl;
cout
<<
( isHeap(pq.h, pq.h
+
pq.e)
?
"
Is heap\n
"
:
"
Not a heap\n
"
);
pq.push(
3
);
pq.push(
1
);
pq.push(
10
);
show(pq.h,pq.size());
cout
<<
"
Top:
"
<<
pq.top()
<<
endl;
cout
<<
( isHeap(pq.h, pq.h
+
pq.e)
?
"
Is heap\n
"
:
"
Not a heap\n
"
);
cout
<<
"
Pop:
"
<<
pq.pop()
<<
endl;
cout
<<
"
Pop:
"
<<
pq.pop()
<<
endl;
cout
<<
"
Pop:
"
<<
pq.pop()
<<
endl;
pq.sort(a);
show(a,pq.size());
return
0
;
}
posted on 2006-07-09 10:11
踏雪赤兔 阅读(650)
评论(2) 编辑 收藏 引用 所属分类:
零件仓库