标签:scanf 设置 存在 节点 递归 编译 blog 比较 oid
算法:先生成随机数,赋值到数组,将数组第一个元素a[0]设置为哨兵,函数调用数组和随机数个数n,再设定n/2的根结点与孩子结点进行比较操作,若右孩子存在,则选出三个数里最小的数赋值给根节点,如果右孩子不存在,则只需比较左孩子与根节点大小,一直循环操作至a[1],再从a[2]开始进行根结点与孩子结点进行比较操作,一直到n/2为止,最后,依次输出a[1],输出后将a[n]赋值给a[1];再进行递归操作,重复以上步骤,直至数组为空
要点:画出二叉树是方便理解,并非数据的结构就是如同二叉树那般存储,存储形式还是一排
编译器:VS2013
代码:
#include "stdafx.h"
#include<stdlib.h>
//函数声明
void HeapSort(int a[],int n); //堆排序(从小到大)
void HSort(int a[], int n);					//辅助堆排序
int main()
{
	int i,n,a[100];
	printf("请输入需要排序元素的个数:");
	scanf_s("%d", &n);
	printf("随机生成的数组为:");
	for (i = 1; i <= n; i++)
	{
		a[i] = rand() % 100 + 1;
		printf("%d ", a[i]);
	}
	a[i] = ‘\0‘;
	printf("\n");
	HeapSort(a,n);
}
//辅助堆排序(从小到大)
void HSort(int a[], int n)
{
	int i = n / 2;
	while (i)
	{
		if (a[2 * i + 1] == ‘\0‘)
		{
			if (a[2 * i] < a[i])
			{
				a[0] = a[2 * i];
				a[2 * i] = a[i];
				a[i] = a[0];
			}
		}
		else
		{
			if (a[2 * i] < a[2 * i + 1])
			{
				if (a[i] > a[2 * i])
				{
					a[0] = a[2 * i];
					a[2 * i] = a[i];
					a[i] = a[0];
				}
			}
			else
			{
				if (a[i] > a[2 * i + 1])
				{
					a[0] = a[2 * i + 1];
					a[2 * i + 1] = a[i];
					a[i] = a[0];
				}
			}
		}
		i--;
	}
	for (i = 2; i <= n / 2; i++)
	{
		if(a[2 * i + 1] == ‘\0‘)
		{
			if (a[2 * i] < a[i])
			{
				a[0] = a[2 * i];
				a[2 * i] = a[i];
				a[i] = a[0];
			}
		}
		else
		{
			if (a[2 * i] < a[2 * i + 1])
			{
				if (a[i] > a[2 * i])
				{
					a[0] = a[2 * i];
					a[2 * i] = a[i];
					a[i] = a[0];
				}
			}
			else
			{
				if (a[i] > a[2 * i + 1])
				{
					a[0] = a[2 * i + 1];
					a[2 * i + 1] = a[i];
					a[i] = a[0];
				}
			}
		}
	}
}
结果

标签:scanf 设置 存在 节点 递归 编译 blog 比较 oid
原文地址:http://www.cnblogs.com/cdp1591652208/p/6209647.html