堆排注释版

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

void PrintArray(int arr[], int len){
	for (int i = 0; i < len; i++){
		cout << arr[i] << " ";
	}
	cout << endl;
}
void my_swp(int* a, int max, int index)
{ 
	int tmp = a[max];
	a[max] = a[index];
	a[index] = tmp;
}

void heapArrjudge(int*a, int index, int len)
{
	//保存当前节点的下标
	int max = index;//不直接操作index,这里就是传过来的结点的数组下标
	//找出左孩子和右孩子的数组下标并且保存
	int lchild = index * 2 + 1;
	int rchild = index * 2 + 2;//+1是因为数组下标从0开始,从树节点转换为数组下标时要+1;
	
	//下面比较这个节点的根是不是最大值,把最大值放进根结点.这就是大顶排序
	if (a[max] < a[lchild] && lchild < len)//为什么len的长度是数组最后一个下标加1,但不会越界?因为是小于,所以不用-1,这样最多会停在数组的最后一个下标,并不会越界;
	{
		max = lchild;
	}
	if (a[max] < a[rchild] && rchild < len)
	{
		max = rchild;
	}
	if (max != index)
	{
		my_swp(a, max, index);
		heapArrjudge(a, max, len);
	}

}

void HeapSort(int* a, int len)
{
	for (int i = len / 2 - 1; i >= 0; i--)//求出最后一个节点位置,为什么要减1,因为数组下标从0开始
	{                                     //如果数组长度是9,9除以2=4.但是第四个数的下标是3
		heapArrjudge(a, i, len);    //这一次进去时只求出第一个最大的.
	}
	for (int i = len -1; i >= 0;i-- )
	{
		my_swp(a,0,i); //此时经过上面的堆排,这时的数组0位置已经变为最大的数.
		heapArrjudge(a, 0, i);//每次数组长度--都调用堆排序把最大的数找出来并替换到最后一个位置.
	}
}


int main(void)
{
	int myArr[] = { 4, 2, 8, 0, 5, 7, 1, 3, 9 };
	int len = sizeof(myArr) / sizeof(int);
	PrintArray(myArr, len);
	//堆排序
	HeapSort(myArr, len);
	printf("\n");
	PrintArray(myArr, len);

	printf("\n");
	system("pause");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值