//6.堆排序
void CreatHeap(int a[], int i, int n) {
// 注意数组是从0开始计数,所以左节点为2*i+1,右节点为2*i+2
for (; i >= 0; --i)
{
int left = i * 2 + 1; //左子树节点
int right = i * 2 + 2; //右子树节点
int j = 0;
//选出左右子节点中最大的
if (right < n) {
a[left] > a[right] ? j = left : j = right;
}
else
j = left;
//交换子节点与父节点
if (a[j] > a[i]) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
void HeapSort(int a[], int n) {
//初始化构造堆
CreatHeap(a, n / 2 - 1, n);
//交换第一个元素和最后一个元素后,堆的大小减1
for (int j = n - 1; j >= 0; j--) {
//最后一个元素和第一个元素进行交换
int tmp = a[0];
a[0] = a[j];
a[j] = tmp;
int i = j / 2 - 1;
CreatHeap(a, i, j);
}
}
堆排序
最新推荐文章于 2022-08-10 16:56:57 发布