排序算法之树形选择排序

树形选择排序是一种类似体育比赛的排序算法,通过两两比较找到最小元素。它构建满二叉树,逐步筛选出最小值,直至所有元素排序完成。算法包括获取数据、构建满二叉树、逐层比较并筛选最小值的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树形选择排序又名锦标赛排序,算法思想与体育比赛类似, 首先将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;
		}
	}</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值