LinuxC/C++编程基础(6) 堆排序的实现
来源:互联网 发布:软件测试报告意义 编辑:程序博客网 时间:2024/05/16 08:47
一.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
- LinuxC/C++编程基础(6) 堆排序的实现
- LinuxC/C++编程基础(5) 排序二叉树的实现
- LinuxC/C++编程基础(9) 二叉查找树的实现
- LinuxC/C++编程基础(10) quicksort的简单实现
- LinuxC/C++编程基础(12) 红黑树的实现
- LinuxC/C++编程基础(30) 视频包缓存的实现
- LinuxC/C++编程基础(36) Poco::BinaryReader的实现
- LinuxC/C++编程基础(37) Cumulus::BinaryReader的实现
- linuxc编程一站式学习(c基础)
- 堆排序的C实现
- 堆排序的实现(c++)
- linuxC编程基础
- LinuxC基础编程
- LinuxC/C++编程基础(1) 函数指针实现复数的加减乘除
- LinuxC/C++编程基础(8) 基于条件变量实现生产者与消费者的实例
- LinuxC/C++编程基础(19) 不可复制类的原理及实现
- LinuxC/C++编程基础(33) 视频包缓存的实现(续1)
- LinuxC/C++编程基础(4) 基于泛型实现vector
- Ubuntu下eclipse 里边 ADT SDK 以及各个插件工具更新方法
- 邮件(3)
- 服务器换机房后cacti监控不出图故障排查
- 设计模式C++学习笔记之十一(Bridge桥梁模式)
- 递归入门
- LinuxC/C++编程基础(6) 堆排序的实现
- Android(SpreadTurm) 从照相机进如图片浏览界面,长按图片上下会闪动,无法读取下一张图片
- uva_11137_Ingenuous Cubrenc(完全背包)
- Allegro建立非标准热风焊盘之 理解X IX IY 命令
- 关于对日项目中的Q&A---Q&A的模板
- 用css3实现的Android Logo
- 假如女人是一种编程语言
- MFC CPen
- 关于对日项目中的Q&A---Q&A的注意点