这次跟大家一起分享一下堆排序:
(二叉)堆是一个数组,元素个数为n,可以被看成一个近似的完全二叉树。我们通过构造出最大堆(就是父节点大于或等于子节点的堆),得到数组中的最大元素(最大堆的根就是数组中最大的元素),然后将根和数组最后一个值交换位置,同时对数组的前n-1项继续构造出最大堆;重复以上过程,我们最后就得到了一个从小到大排列的数组。
代码在下边,大家有什么不理解的话可以留言讨论。
#include<iostream>
#include<limits.h>
#include<math.h>
#define LEFT(i) 2*i+1; //左孩子
#define RIGHT(i) 2*i+2; //右孩子
#define PARENT(i) floor((i-1)/2); //parent
using namespace std;
void HEAPSORT(int *A,int size); //堆排序方法
void BUILD_MAX_HEAP(int *A,int size); //建最大堆
void exchange(int *A,int i,int j); //交换数组A的下标为i和j的元素
void MAX_HEAPIFY(int *A,int i,int size); //使得以i为根的二叉树是最大堆
void Out(int *A); //打印输出
int main()
{
int A[]={1,14,10,8,7,9,3,2,4,16};
HEAPSORT(A,10);
cout<<"结果:";
Out(A);
cout<<endl;
}
void Out(int *A){
for(int i=0;i<10;i++){
cout<<A[i]<<" ";
}
cout<<endl;
}
void HEAPSORT(int *A,int size){ //堆排序方法
cout<<"初始:";
Out(A);
cout<<endl;
BUILD_MAX_HEAP(A,size);
cout<<"最大堆:";
Out(A);
for(int i=size-1;i>=1;i--){
exchange(A,0,i);
size--;
MAX_HEAPIFY(A,0,size);
}
}
void BUILD_MAX_HEAP(int *A,int size)//建最大堆
{
int start=floor(size/2)-1;
for(int i=start;i>=0;i--)
{
MAX_HEAPIFY(A,i,size);
}
}
void MAX_HEAPIFY(int *A,int i,int size) //使得以i为根的二叉树是最大堆
{
int largest=0;
int l=LEFT(i);
int r=RIGHT(i);
if(l<=size-1 && A[l]>A[i]){
largest=l;
}
else
{
largest=i;
}
if(r<=size-1 && A[r]>A[largest]){
largest=r;
}
if(largest!=i){
exchange(A,i,largest);
MAX_HEAPIFY(A,largest,size);
}
}
void exchange(int *A,int i,int j){
int temp=0;
temp=A[i];
A[i]=A[j];
A[j]=temp;
}