树形选择排序又名锦标赛排序,算法思想与体育比赛类似, 首先将n个数据元素两两分组,分别按关键字进行比较,得到n/2个比较的优胜者(关键字小者),作为第一步比较的结果保留下来, 然后对这n/2个数据元素再两两分组,分别按关键字进行比较,如此重复,直到选出一个关键字最小的数据元素为止。
树形选择排序构成的树是满二叉树。
算法步骤:
1.先获取需要排序的n个数据对象。
2.将n个数据对象用数组进行存储。
list(int ms):maxsize(ms),currsize(0) //初始化
{
vec = new node < T >[maxsize];
std::cout << "please input" << maxsize << " numbers" << std::endl;
T num;
int i = 0;
while (cin >> num)
{
if (i < maxsize)
{
vec[i].data = num;
++i;
++currsize;
}
}
}
这里只是构造函数,在构造函数里面进行存储需要排序的数据。
3.将n个数据对象构成满二叉树的外节点层,如果n不是2的幂次方,则添加数据元素构成满叉树外节点层。
4.将数组存储的数据填充外节点层,类似于二叉树的数组存储结构。
int nsize = 1;
while (nsize < currsize) //如果节点数为2的k次幂,则构成满二叉树,否则增加节点构成满二叉树
{
nsize = nsize * 2;
}
int treesize = 2*nsize - 1; //二叉树的结点数,nsize为叶子节点个数(最后一层)
node<T>* tree = new node < T >[treesize]; //构造满二叉树
int insize = nsize - 1; //内节点的个数
int j = 0;
for (int i =insize ; i < treesize; ++i) //将数据填充到二叉树
{
tree[i].index = i;
if (j < currsize)
{
tree[i].data = vec[j].data;
++j;
}
else //将增加的结点值赋为无穷大
{
tree[i].data = INT_MAX;
}
}
</