堆排序

void swap(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

void ajustHeap(int a[], int start, int len) //根节点值变动后调整成新的大根堆
{
	int dad = start, son = 2 * dad + 1;
	while (son < len)
	{
		if (son + 1 < len && a[son] < a[son + 1]) //比较子节点
		{
			son++;
		}

		if (a[dad] < a[son])
		{
			swap(a + dad, a + son);
			dad = son;
			son = 2 * dad + 1;
		}
		else
			break;

	}
}

void createHeap(int a[], int start, int len)
{
	if (a == NULL || start < 0 || len <= 0)
		return;

	int i = len - 1, son, dad;
	for (; i > 0; i--)
	{
		son = start + i;
		dad = (son - 1) / 2;
		if (a[son] > a[dad])  //子节点 > 父节点 交换
		{
			swap(a + son, a + dad);
			dad = son;
			son = dad * 2 + 1;
			if ((son < len && a[dad] < a[son]) || (son + 1 < len && a[dad] < a[son + 1]))  //交换后判断子节点和孙子节点是否满足子节点 > 孙子节点
			{
				ajustHeap(a, dad, len);
			}
		}
	}
}

void heapSort(int a[], int len)
{
	for (int i = 1; i < len; ++i)
	{
		swap(a, a + len - i);
		ajustHeap(a, 0, len - i);
	}
}



int main(int argc, char **argv)
{
	int a[] = { 3, 7, 4, 1, 32, 23, 66, 43, 12, 61, 17, 6, 9, 0, 5 };
	int len = sizeof(a) / sizeof(int);
	createHeap(a, 0, len);
	heapSort(a, len);
	for (int i = 0; i < len; ++i)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	system("pause");

	return 0;
}

测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vfdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值