#include <iostream>
using namespace std;
/*
@arr[] 这是输入的数组
@root 从这个跟节点开始,递归向下层交换比它大的数,使其变成最大堆
@size 数组的大小
*/
void heapRebuild(int arr[],int root, int size)
{
//按照层序遍历的实现,把一个数组看成一个堆
int leftChild=2*root+1;
int maxChild=leftChild;
if(leftChild<=size-1)
{
int rightChild=leftChild+1;
if(rightChild<=size-1)
{
if(arr[leftChild]<arr[rightChild])
{
maxChild=rightChild;
}
}
if(arr[root]<arr[maxChild])
{
//根节点和子节点中比它大而且最大的那个数交换
swap(arr[root],arr[maxChild]);
heapRebuild(arr,maxChild,size);
}
}
}
void heapSort(int arr[],int size)
{
/* size/2-1是最后一个非叶子节点
循环过后,这个堆会变成最大堆*/
for(int i=size/2-1;i>=0;i--)
{
heapRebuild(arr,i,size);
}
/* 把最大堆的堆顶元素,交换至最后一个位置
并且让堆顶的元素重新递归向下交换,变成最大堆*/
for(int last=size-1;last>=1; last--)
{
swap(arr[0],arr[last]);
heapRebuild(arr,0,last);
}
}
int main()
{
int arr[]={10,2,13,41,23,52,7,31,65,90,99,56,77,77};
int SIZE=sizeof(arr)/sizeof(arr[0]);
heapSort(arr,SIZE);
cout<<"after heap sorting:"<<endl;
for(int i=0; i<SIZE; i++)
{
cout<<" "<<arr[i];
}
cout<<endl;
}
【day-2】最大堆排序-递归
最新推荐文章于 2022-09-30 17:02:00 发布