一、原理:
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆排序的平均时间复杂度为Ο(nlogn) 。
算法步骤:
1)创建一个堆H[0..n-1]
2)把堆首(最大值)和堆尾互换
3)把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置
4) 重复步骤2,直到堆的尺寸为1
二、代码
#include
using namespace std;
/*最大堆定义*/
class MaxHeap
{
private:
int size; //最大堆的元素数目
int * array; //最大堆数组的首地址指针
public:
MaxHeap(int array[],int n); //用已有数组初始化一个最大堆
void buildHeap(); //构建最大堆
void siftDown(int index); //向下筛选法
void swap(int index1,int index2); //交换位置为index1与index2的元素
void removeMax(); //删除堆顶的最大值--与数组最后一个元素交换位置并重新构建最大堆
int leftChild(int index); //返回左孩子的位置
int rightChild(int index); //返回右孩子的位置
}; #include
#include "MaxHeap.h"
using namespace std;
/*最大堆成员函数实现*/
MaxHeap::MaxHeap(int array[],int n)
{
this->array=array;
size=n;
buildHeap();
}
void MaxHeap::buildHeap()
{
for(int i=size/2-1;i>=0;i--)
siftDown(i);
}
void MaxHeap::siftDown(int index)
{
int max_index=leftChild(index);
while(max_index
array[max_index])
max_index++;
if(array[index]>array[max_index])
break;
swap(index,max_index);
index=max_index;
max_index=leftChild(index);
}
}
void MaxHeap::swap(int index1,int index2)
{
int temp=array[index1];
array[index1]=array[index2];
array[index2]=temp;
}
void MaxHeap::removeMax()
{
swap(0,size-1);
size--;
siftDown(0);
}
int MaxHeap::leftChild(int index)
{
return index*2+1;
}
int MaxHeap::rightChild(int index)
{
return index*2+2;
} #include
#include "MaxHeap.h"
using namespace std;
/*最大堆排序函数*/
void heapSort(int array[],int n)
{
MaxHeap max_heap=MaxHeap(array,n);
/*删除堆的最大值(堆顶),即每次将最大值与数组的最后一个元素交换位置*/
for(int i=0;i<7;i++)
max_heap.removeMax();
}
int main()
{
int array[8]={4,3,7,1,2,8,5,6};
heapSort(array,8);
for(int i=0;i<8;i++)
cout<
<<" "<