堆排序算法(加详细注释版)

C语言堆排序代码

在这里笔者只是对堆排序代码假如更加详细的注释,以便于学会原理但是看不懂或者不会自己编译代码的初学者进行学习。本篇的代码来源来自大佬紫红的紫红的一篇文章:排序算法之堆排序(Heap Sort)——C语言实现还不懂算法的请先看一下这篇文章。
在这里插入图片描述
编译环境是:VS2015

#include<stdio.h>
#include<stdlib.h>
//大顶堆,a[1]为最大值

void HeapAdjust(int a[], int s, int m)//a为存储数据的数组,s为正在调整的不正确的起点,m为数组长度
{
	int rc, j;//rc为a[s]的临时存储位置,j为循环变量,同时用来确定a[s]的两个子树在数组中的位置,所以j=2s或者2s+1
	rc = a[s];//存储当前值
	for (j = 2 * s; j <= m; j = j * 2)//先判断左孩子,j=j*2意味着继续修正下一个错误、
	{//j<m因为数组从1开始
		if (j < m&&a[j] < a[j + 1])   j++;//j<m为前提条件,在左右孩子中选择比较大的一个进行操作
		if (rc > a[j]) break;//如果正在判断的结点大于其左右子树,则跳出循环,不进行操作

		a[s] = a[j];//若需要调整,直接让较大的子树上位,到达原本结点
		s = j;//此时判断是否需要调整的结点变成刚上去的子树,循环中该位置没有赋予原本作为双亲的值,因为可能之后还需要调整,此处不一定是双亲正确的位置
	}
	a[s] = rc;//rc赋给了正确位置
}

void HeapSort(int a[], int n)//堆排序的主体程序
{
	int temp, i, j;
	for (i = n / 2; i > 0; i--)//从中间开始进行调整,最终初始化堆
	{
		HeapAdjust(a, i, n);
	}
	//排序
	for (i = n; i > 0; i--)//初始化i为最后一个数,为下面每次和最后一个值进行交换做铺垫
	{//i>0为终止条件是因为数组从1开始
		temp = a[1];
		a[1] = a[i];
		a[i] = temp;//交换第一个值和最后一个值
		HeapAdjust(a, 1, i - 1);//交换完毕后再次进行调整,此时起点为第一个,存储大小减一,最后一个被赋予了所有数的最大值
	}
}

int main()
{
	int n, i, *a;
	printf("输入数组长度");
	scanf("%d", &n);
	a = (int*)malloc((n + 1) * sizeof(int));
	printf("请输入数据:");
	for (i = 1; i <= n; i++)
	{
		scanf("%d", &a[i]);
	}
	HeapSort(a, n);
	printf("排序后:\n");
	for (i = 1; i <= n; i++)
	{
		printf("%d<", a[i]);
	}
	system("pause");
}

运行效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值