堆排序--C语言实现

#include<stdio.h>

//arr是待调整的堆数组,length是数组的长度
void HeapAdjust(int arr[], const int length) {
	for (int j = length - 1; j > 0; --j) {
		int parent = j / 2;
		int child = j;
		//得到子结点中较大的结点
		if (j < length - 1 && arr[j] < arr[j + 1]) {     
			++child;
		}
		//如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点
		if (arr[child] > arr[parent]) {
			int tmp = arr[child];
			arr[child] = arr[parent];
			arr[parent] = tmp;
		}
	}
}
void HeapSort(int arr[], const int length) {
	for (int j = length; j > 0; --j) {
		//不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
		HeapAdjust(arr, j);
		//把第一个元素和当前的最后一个元素交换,
		//保证当前的最后一个位置的元素都是在现在的这个序列之中最大的
		int tmp = arr[0];
		arr[0] = arr[j - 1];
		arr[j - 1] = tmp;
	}
}

int main()
{
	int arr[] = {5, 6, 1, 4, 9, 2, 7, 3, 8, 0 };
	int n = sizeof(arr) / sizeof(arr[0]);
	HeapSort(arr, n);
	for (int j = 0; j < n; ++j) {
		printf("%d ", arr[j]);
	}
	printf("\n");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值