会员
周边
众包
新闻
博问
闪存
赞助商
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式
...
退出登录
注册
登录
A New Hope!
无愧于心,良机无限
博客园
首页
新随笔
联系
管理
订阅
数据结构学习(3):堆化优先队列
using
System;
namespace
DataStructure.HeapPQ
{
/**/
///
<summary>
///
Class1 的摘要说明。
///
</summary>
class
PriorityQueueApplet
{
/**/
///
<summary>
///
应用程序的主入口点。
///
</summary>
[STAThread]
static
void
Main(
string
[] args)
{
int
n
=
10
;
ComparisonKey[] A
=
new
ComparisonKey[n];
//
A为需要进行排序的数组,10个
//
将数组A初始化为进行10个整数的排序并对其进行打印
for
(
int
i
=
0
;i
<
n;i
++
)
{
A[i]
=
new
PQItem(squareOf(
3
*
i
-
13
));
Console.Write(A[i]
+
"
,
"
);
}
Console.WriteLine();
//
本排序的整数输出为:169.100.49.16.1.4.25.64.121.196
//
利用priorityQueue sorting对数组进行排序
priorityQueueSort(A);
//
排序之后打印数组A中的值
for
(
int
i
=
0
;i
<
n;i
++
)
{
Console.WriteLine(A[i]
+
"
,
"
);
}
Console.WriteLine();
}
public
static
int
squareOf(
int
x)
{
return
x
*
x; }
public
static
void
priorityQueueSort(ComparisonKey[] A)
{
int
i;
//
i为一个整数数组的索引变量
int
n
=
A.Length;
//
N为要排序数组A的长度
PriorityQueue PQ
=
new
PriorityQueue();
//
PQ初始为空
for
(i
=
0
;i
<
n;i
++
) PQ.insert(A[i]);
//
将A的元素插入PQ中
for
(i
=
n
-
1
;i
>=
0
;i
--
) PQ.remove();
//
删除PQ的元素并将其插入A中
}
}
public
class
ListNode
{
public
ComparisonKey item;
public
ListNode link;
}
class
PriorityQueue
{
private
int
count;
//
优先队列中的元素数目
private
int
capacity;
//
可用数组位置的数量
private
int
capacityIncrement;
//
在数组扩展过程中容量的增幅
private
ComparisonKey[] itemArray;
//
存放PQ元素的数组
/**/
/*
---------------------
*/
//
定义构造函数
public
PriorityQueue()
{
count
=
0
;
capacity
=
16
;
capacityIncrement
=
8
;
itemArray
=
new
ComparisonKey[capacity];
}
public
int
Size()
{
return
count;
}
/**/
/*
insert()方法在链表中插入一个新的元素
*/
public
void
insert(ComparisonKey newItem)
{
//
如果itemArray容量不够
//
可以通过capacityIncrement
if
(count
==
capacity
-
1
)
{
capacity
+=
capacityIncrement;
ComparisonKey[] tempArray
=
new
ComparisonKey[capacity];
for
(
int
i
=
1
;i
<=
count;i
++
)
{
tempArray[i]
=
itemArray[i];
}
itemArray
=
tempArray;
}
//
优先队列数量递增1 并在当前优先对联元素顺序的末端插入newItem
count
++
;
int
childLoc
=
count;
int
parentLoc
=
childLoc
/
2
;
while
(parentLoc
!=
0
)
{
if
(newItem.compareTo(itemArray[parentLoc])
<=
0
)
{
itemArray[childLoc]
=
newItem;
//
存储newItem并返回
return
;
}
else
{
itemArray[childLoc]
=
itemArray[parentLoc];
childLoc
=
parentLoc;
parentLoc
=
childLoc
/
2
;
//
变换位置
}
}
itemArray[childLoc]
=
newItem;
//
将newItem放入最终剩下的位置
}
public
ComparisonKey remove()
{
if
(count
==
0
)
//
如果优先队列为空,返回true;
{
return
null
;
}
else
//
否则,返回根元素重新堆化
{
//
声明
int
currentLoc;
//
当前查看的位置
int
childLoc;
//
currentLoc的孩子
ComparisonKey itemToPlace;
//
重新定位的元素值
ComparisonKey itemToReturn;
//
返回的删除元素值
//
初始化
itemToReturn
=
itemArray[
1
];
//
存储稍后返回的根元素
itemToPlace
=
itemArray[count
--
];
//
末端的叶子元素
currentLoc
=
1
;
//
从根开始的currentLoc
childLoc
=
2
*
currentLoc;
//
从根的左孩子开始childLoc
while
(childLoc
<=
count)
//
当仍然存在孩子的时候
{
//
设childLoc为currentLoc的较大的孩子
if
(childLoc
<
count)
{
//
如果存在右孩子
if
(itemArray[childLoc
+
1
].compareTo(itemArray[childLoc])
>
0
)
childLoc
++
;
}
//
如果childLoc的元素大于itemToPlace
//
那么将这个较大元素移动到currentLoc;
//
并将currentLoc下移
if
(itemArray[childLoc].compareTo(itemToPlace)
>
0
)
{
itemArray[currentLoc]
=
itemArray[childLoc];
currentLoc
=
childLoc;
childLoc
=
2
*
currentLoc;
}
else
{
itemArray[currentLoc]
=
itemToPlace;
return
itemToReturn;
}
}
//
itemToPlace的最终替换
itemArray[currentLoc]
=
itemToPlace;
//
返回最初在根中的元素
return
itemToReturn;
}
}
}
interface
ComparisonKey
{
//
如果K1和K2均为ComparisonKey,那么K1.compareTo(k2)就会有三个值0,1,-1,
//
就是K1==K2,K1>K2,K1<K2顺序是compareTo方法定义的优先级别顺序
int
compareTo(ComparisonKey value);
//
将ComparisonKey转换成可以打印的字符串
string
toOurString();
}
public
class
PQItem:ComparisonKey
{
private
int
key;
//
key数据包括给出元素优先级别的整数关键字
public
PQItem(
int
value)
{
key
=
value;
}
ComparisonKey 成员
#region
ComparisonKey 成员
public
int
compareTo(ComparisonKey value)
{
int
a
=
this
.key;
int
b
=
((PQItem)value).key;
return
((a
==
b)
?
0
:((a
>
b)
?
1
:
-
1
));
}
public
string
toOurString()
{
return
this
.key.ToString();
}
#endregion
}
}
posted @
2006-12-14 19:01
大天使泰瑞尔
阅读(
758
) 评论(
0
)
编辑
收藏
举报
会员力量,点亮园子希望
刷新页面
返回顶部
公告