C++ 堆排序

堆排序的原理:

堆是一棵完全二叉树,堆满足两个属性:

(1)堆的每一个父节点的值都大于(或小于)其子节点;

(2)树是完全平衡的,最底层的叶节点都位于最左边的位置上。

 

大顶堆:

(1)首先,通过“左右节点”与“父节点”不断地进行比较,得出最大值作为根节点,这样就形成了一个大顶堆。

(2)然后把最大值拿出来,放到后面的位置,这样元素就减少一个,之后再去重新建堆。

(3)不断的重复以上操作,最后就有顺序了。

#include <iostream>
#include <stdlib.h>
using namespace std;

/*******************************************/
/*  堆排序
/******************************************/

void swap(int &a, int &b)  //位置互换函数
{
	int temp = a;
	a = b;
	b = temp;
}


void Heap(int array[], int length, int index)  //堆排序算法(大顶堆)
{
	int left = 2 * index + 1;  //左节点数组下标
	int right = 2 * index + 2;  //右节点数组下标
	int max = index;  //index是父节点

	if (left < length && array[left] > array[max])  //左节点与父节点比较
	{
		max = left;
	}
	
	if (right < length && array[right] > array[max])  //右节点与父节点比较
	{
		max = right;
	}

	if (array[index] != array[max])
	{
		swap(array[index], array[max]);
		Heap(array, length, max);  //递归调用
	}
}


void HeapSort(int array[], int size)  //堆排序函数
{
	for (int i = size / 2 - 1; i >= 0; i--)  // 创建一个堆
	{
		Heap(array, size, i);
	}

	for (int i = size - 1; i >= 1; i--)
	{
		swap(array[0], array[i]);  //将array[0]的最大值放到array[i]的位置上,最大值往后靠
		Heap(array, i, 0);  //调用堆排序算法进行比较
	}
}


int main(void)  //主程序
{
	const int n = 6;  //数组元素的数量
	int array[n];
	cout << "请输入6个整数:" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> array[i];
	}

	cout << endl;  //换行

	HeapSort(array, n);  // 调用HeapSort函数  进行比较

	cout << "由小到大的顺序排列后:" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << "Array" << "[" << i << "]" << " = " << array[i] << endl;
	}

	cout << endl << endl;  //换行

	system("pause");  //调试时,黑窗口不会闪退,一直保持
	return 0;
}

运行结果:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值