一.heap.h的声明,如下:
#ifndef HEAP_H_
#define HEAP_H_
class Heap{
public:
Heap(){};
~Heap(){};
public:
int Parent(int i);
int Left(int i);
int Right(int i);
void MaxHeapify(int A[],int i);
void BuildMaxHeap(int A[]);
void HeapSort(int A[]);
int HeapSize();
void setHeapSize(int size);
int ArraySize();
void setArraySize(int size);
private:
int heapsize;
int arraysize;
};
inline int Heap::Parent(int i){
return i / 2;
}
inline int Heap::Left(int i){
return i << 1;
}
inline int Heap::Right(int i){
return (i << 1) + 1;
}
inline int Heap::HeapSize(){
return heapsize;
}
inline void Heap::setHeapSize(int size){
heapsize = size;
}
inline int Heap::ArraySize(){
return arraysize;
}
inline void Heap::setArraySize(int size){
arraysize = size;
}
#endif /* HEAP_H_ */
二.heap.cpp的实现,如下:
#include "heap.h"
void Heap::MaxHeapify(int A[],int i){
int l = Left(i);
int r = Right(i);
int largest = 0;
if(l <= HeapSize() && A[l] > A[i]){
largest = l;
}else{
largest = i;
}
if(r <= HeapSize() && A[r] > A[largest]){
largest = r;
}
if(largest != i){
int tmp = A[i];
A[i] = A[largest];
A[largest] = tmp;
MaxHeapify(A,largest);
}
}
void Heap::BuildMaxHeap(int A[]){
int length = ArraySize();
setHeapSize(length);
for(int i=length / 2;i>0;--i){
MaxHeapify(A,i);
}
}
说明:含有n个元素的堆,则非叶子节点为1~n/2,这是建堆的基础,具体可用归纳法证明,这里略去!
void Heap::HeapSort(int A[]){
int tmp = 0;
int length = ArraySize();
BuildMaxHeap(A);
for(int i=length;i>1;--i){
tmp = A[1];
A[1] = A[i];
A[i] = tmp;
setHeapSize(HeapSize() - 1);
MaxHeapify(A,1);
}
}
转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8215522
三.main.cpp的实现,如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "heap.h"
#define ARRAYLENGTH 30
#define DEFINEARRAYLENGTH ARRAYLENGTH+1
int main(int argc,char** argv){
int data[DEFINEARRAYLENGTH] = {-1};
int i = 0;
Heap heap;
srand(time(NULL));
for(i=1;i<=ARRAYLENGTH;++i){
data[i] = rand() % 100;
}
printf("before heapsort\n");
for(i=1;i<=ARRAYLENGTH;++i){
printf("%d ",data[i]);
}
heap.setArraySize(ARRAYLENGTH);
heap.HeapSort(data);
printf("\n after heapsort\n");
for(i=1;i<=ARRAYLENGTH;++i){
printf("%d ",data[i]);
}
return 0;
}
说明:代码简洁明了,无需赘述
总结堆排序的过程如下:
1.建堆:即从非叶子节点开始调整堆,构建成最大堆或者最小堆,具体需要具体处理
2.排序:即不断地与堆的最大值交换排序(这里以最大堆为例)
转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8215522