堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
子节点总是小于其父节点的堆结构称为最大堆(MaxHeap)
子节点总是大于其父节点的堆结构称为最小堆(MinHeap)
堆排序分二部分:
1.建立堆结构
2.堆排序(包含最大或最小堆的维护)
首先说明一下最大堆的维护
void max_heapify(int data[],int length,int i){
int left=2*i;
int right=2*i+1;
int largest;
if(left<=length&&data[left]>data[i])
largest=left;
else
largest=i;
if(right<=length&&data[right]>data[largest])
largest=right;
if(largest!=i){
swap(data[i],data[largest]);
max_heapify(data,length,largest);
}
}
最大堆维护的非递归算法
void max_heapify(int data[],int length,int i){
while(i<=length){
int left=2*i;
int right=2*i+1;
int largest;
if(left<=length&&data[left]>data[i])
largest=left;
else
largest=i;
if(right<=length&&data[right]>data[largest])
largest=right;
if(largest!=i){
swap(data[i],data[largest]);
i=largest;
}else
break;
}
}
其中交换数值代码如下
void swap(int &a,int &b){
int tmp=a;
a=b;
b=tmp;
}
建立最大堆结构采用自底向上的形式。从最后一个非叶子节点开始
void build_heap(int A[],int length){
for(int i=length/2;i>=1;i--)
max_heapify(A,length,i);
}
整体的排序算法:
void HeapSort(int A[],int length){
int size=length;
build_heap(A,length);
for(int i=length;i>=2;i--){
swap(A[i],A[1]);
size--;
max_heapify(A,size,1);
}
}
测试代码如下:
#include<iostream>
using namespace std;
#define NoNum -65535
int main(){
//int a=5,b=50;
//swap(a,b);
//cout<<a<<" "<<b<<endl;
int datas[11] = {NoNum,5,3,17,10,84,19,6,22,9,35};
HeapSort(datas,10);
for(int i=1;i<=10;i++)
cout<<datas[i]<<" ";
cout<<endl;
return 0;
}