简言:这里我只是给出了代码和注释,如果想要理解算法的意义,可以去看这位博主的讲解还是很清楚的。如果有不清楚的话,欢迎小伙伴私聊求问。
这里需要自己给数组赋值。最终实现数组的推排序赋值
#include <stdio.h>
#include <stdlib.h>
swap(int arr[],int i,int max)
{
int tmp = arr[i];
arr[i] = arr[max];
arr[max] = tmp;
}
void Heapify(int arr[],int i,int N)
{
//n表示的是这棵树有多少个节点
//这个只能运算最简单的堆运算
int rchild = 2 * i + 2;//右孩子结点
int lchild = 2 * i + 1;//左孩子结点
int max = i;//保存最大值的数组下标
if(i>=N){
return ;
}
//如果我的左孩子比我的父亲节点还要大的话,就将左孩子的数组下标赋值给我们的max变量
if(arr[lchild]>arr[max] && lchild < N){
max = lchild;
}
//如果我们的右孩子比我的父亲结点大的话,就将我的右孩子赋值给我的max下标
if(arr[rchild] > arr[max] && rchild<N){
max=rchild;
}
if(max != i){
swap(arr,i,max);
Heapify(arr,max,N);
}
}
void CreatMaxHeap(int arr[],int N)
{
int i,last_node = N - 1;
int parent = (last_node - 1)/2;//这里是最后一个二叉树的位置
for(i = parent;i >= 0;i--){
Heapify(arr,i,N);
}
}
void HeapSort(int arr[],int N)
{
CreatMaxHeap(arr,N);
int i;
for(i = N-1;i>=0; i--)
{
swap(arr,0,i);
Heapify(arr,0,i);
}
}
int main()
{
int arr[7] = {3,7,2,9,8,11,5};
int i,N = 7;
//Heapify(arr,0,N);
//CreatMaxHeap(arr,N);
HeapSort(arr,N);
for(i = 0;i<N;i++){
printf("%d ",arr[i]);
}
return 0;
}
运行结果;