堆排序
来源:互联网 发布:楚河汉界刷黄金软件 编辑:程序博客网 时间:2024/06/04 19:22
//堆排序
#include <iostream>
using namespace std;
int heapSize = 0;
//返回左子节点索引
int Left(int index) {
return ((index << 1) + 1);
}
//返回右子节点索引
int Right(int index) {
return ((index << 1) + 2);
}
//交换a、b的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
//array[index]与其左右子树进行递归对比
//用最大值替换array[index], index表示堆顶索引
void maxHeapify(int array[], int index) {
int largest = 0;//最大数
int left = Left(index);//左子节点索引
int right = Right(index);//右子节点索引
//把largest赋为堆顶与其左子节点的较大者
if((left <= heapSize) && (array[left] > array[index]))
largest = left;
else
largest = index;
//把largest与堆顶的右子节点比较, 取较大者
if(largest != index) {
//如果堆顶不是最大者, 则交换, 并递归调整堆
swap(&array[index], &array[largest]);
maxHeapify(array, largest);
}
}
//初始化堆, 将数组中的每一个元素置放到适当的位置
//完成之后, 堆顶的元素为数组的最大值
void buildMaxHeap(int array[], int length) {
int i;
heapSize = length;//堆大小赋为数组长度
for(i = (length >> 1); i >= 0; i--)
maxHeapify(array, i);
}
void heap_sort(int array[], int length) {
int i;
//初始化堆
buildMaxHeap(array, (length - 1));
for(i = (length - 1); i >= 1; i--) {
swap(&array[0], &array[i]);
//堆顶元素array[0](即数组的最大值)被置换到数组的尾部array[i]
heapSize--; //从堆中移除该元素
maxHeapify(array, 0);//重建堆
}
}
int main(void) {
int a[8] = {45, 68, 20, 39, 88, 97, 46, 59};
heap_sort(a, 8);
int i = 0;
for(i = 0; i < 8; i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- ERROR 2002 (HY000):
- TCP连接的三次握手--一次故障记录
- 关于fpga的用途
- 《JavaEE框架技术进阶式教程》之JavaEE运行及开发环境的搭建
- C++ primer 学习笔记 二
- 堆排序
- ejb概述——(一)
- VC编程练习之API笔记(二)
- hadoop JobTracker获取启动时间
- Java正则表达式 重复字符(串)问题
- Java Thread.yield详解
- js个性
- 在eclipse中导入Java文件的具体步骤
- Struts2基于XML配置方式实现对Action方法进行校验