一些关于堆排序东西!

堆排序是指利用堆这种数据结构所设计的一种排序算法。

堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

堆一般都指的是二叉堆,它满足二个特性:

           1:父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。

           2:每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。

堆调整:

void heapify(int *a, int i, int len)
{
int left = 2 * i + 1;     // 左孩子结点下标
int right = 2 * i + 2;    // 右孩子结点下标
int max = i;     // 三个节点中最大元素的下标

if (left < len && a[left] > a[max])
max = left;
if (right < len && a[right] > a[max])
max = right;

if (max != i)   // 当前父节点不是所有结点中最大的元素,需要做调整
{
swap (a, i, max);
heapify (a, max, len);   // 调整被交换的结点
}
}

堆排序函数:

void heapSort (int *a, int len)
{
// 建堆
int i;
for (i = len/2 - 1; i >= 0; i--)
{
heapify (a, i, len);
}

// 排序
for (i = len-1; i > 0; i--)
{
swap (a, 0, i);       // 拿堆顶元素与队尾元素进行交换
len--;                // 找到一个最大元素以后堆大小减1
heapify (a, 0, len);  // 调整堆顶元素
}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值