//堆排序,其复杂的为nlog(n)
#include <iostream>
using namespace std;
//交换数组下标为i,j的元素
void Swap(int tree[], int i, int j)
{
int temp = tree[i];
tree[i] = tree[j];
tree[j] = temp;
}
//堆化,将数组转化为大顶堆 如:[4,10,3]-->[10,4,3]
//如果i节点进行了交换,为保证数组的整个堆结构,必须对交换的节点继续堆化,即递归堆化
void heapify(int tree[], int n, int i)//n为数组大小,i为堆化节点位置
{
if (i >= n)//递归出口
{
return;
}
int c1 = 2 * i + 1; //该节点的左子树下标
int c2 = 2 * i + 2; //该节点的右子树下标
int max = i;
//获取三个节点最大值位置,并将最大值置为堆顶
if (c1 < n && tree[c1] > tree[max])
{
max = c1;
}
if (c2 < n && tree[c2] > tree[max])
{
max = c2;
}
if (max != i)
{
Swap(tree, max, i);
heapify(tree, n, max);
}
}
//对任意数组建堆,n为数组大小
//从堆结构的倒数第二层开始,向上堆化
void build_heap(int tree[], int n)
{
int last_node = n - 1;//数组的最后一个节点,其父节点即为开始堆化的节点
int parent = (last_node - 1) / 2;
int i;
for (i = parent; i >= 0; i--)
{
heapify(tree, n, i);
}
}
//将最后一个节点与第一个节点交换,去掉最后一个节点,堆化第一个节点
//循环操作直至剩下一个节点即获得从小到大排序的数组。
void heap_sort(int tree[], int n)
{
build_heap(tree, n);
int i;
for (i = n - 1; i >= 0; i--)
{
Swap(tree, i, 0);
heapify(tree, i, 0);
}
}
int main()
{
int tree[6] = { 4, 10, 3, 5, 1, 2 };
int i;
heap_sort(tree, 6);
for (i = 0; i < 6; i++)
{
printf("%d ", tree[i]);
}
printf("\n");
system("pause");
return 0;
}
算法二:堆排序
最新推荐文章于 2022-11-16 16:20:28 发布