排序算法-堆排序

// (堆排序-大堆) 使用数组来表示 二叉树型结构
static void down_adjust(int array[], int size, int father) {
	int r_chirld = 0;
	int l_chirld = 0;
	bool flag = false;
	for (int cur = father; cur <= size / 2 - 1; ) {
		r_chirld = (cur + 1) * 2;
		l_chirld = (cur + 1) * 2 - 1;
		flag = false;
		if (r_chirld >= size) {// 无右孩子
			if (array[l_chirld] > array[cur]) {
				std::swap(array[l_chirld], array[cur]);
				cur = l_chirld;
				flag = true;
			}
		}
		else {
			if (array[l_chirld] >= array[r_chirld] && array[l_chirld] > array[cur]) {
				std::swap(array[l_chirld], array[cur]);
				cur = l_chirld;
				flag = true;
			}
			else if (array[l_chirld] < array[r_chirld] && array[r_chirld] > array[cur]) {
				std::swap(array[r_chirld], array[cur]);
				cur = r_chirld;
				flag = true;
			}
		}

		if (!flag) break;
	}
}
static void create_heap(int array[], int size) {
	// 从最后一个父节点开始调整
	int father = size / 2 - 1;

	for (int i = father; i >= 0; --i) {
		// 调整每一个节点
		down_adjust(array, size, i);
	}
}
void heap_sort(int array[], int size) {
	if (!array || size <= 0) {
		return;
	}
	// 构建堆
	create_heap(array, size);

	// 逐个删除
	for (int i = size; i >= 1; --i) {
		std::swap(array[i - 1], array[0]);
		down_adjust(array, i - 1, 0);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值