堆排序
2016-03-05 21:46
267 查看
堆排序是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。
可以利用数组的特点快速定位指定索引的元素。堆分为最大堆和最小堆,是完全二叉树。最大堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是最大堆,因为根据最大堆的要求可知,最大的值一定在堆顶。
堆是一种特殊的完全二叉树,如果一个完全二叉树父结点编号为k,那么他左儿子编号就是2*k,右儿子是2*k+1.如果左/右儿子编号是x,父结点是x/2
还有一个更要性质:最后一个非叶结点是第n/2个结点
将二叉树向下调整的代码:
void siftdown(int i) {//向下调整,传入要调整的编号i int t, flag = 0;//t是记录较小节点的编号,flag是标记是否要继续向下调整 while (i * 2 <= n&&flag == 0) {//当存在左孩子且可以向下调整时 if (h[i] < h[i * 2])//判断他和他左孩子的关系,记录较小节点的编号 t = i * 2; else t = i; if (i * 2 + 1 <= n) {//如果有右孩子的话 if (h[t] < h[i * 2 + 1]) t = i * 2 + 1; } if (t != i) {//如果最小的编号不是自己,就进行交换 swap(t, i); i = t;//更新编号 } else flag = 1;//否则不需要再调整了 } }
建堆的方法:
for(int i=n/2;i>=1;i--) siftdown(i);
完整的堆排序代码:
#include<iostream>
using namespace std;
int h[101];//存放堆的数组
int n;//堆的大小
void swap(int x, int y) {//交换函数
int t;
t = h[x];
h[x] = h[y];
h[y] = t;
}
void siftdown(int i) {//向下调整,传入要调整的编号i int t, flag = 0;//t是记录较小节点的编号,flag是标记是否要继续向下调整 while (i * 2 <= n&&flag == 0) {//当存在左孩子且可以向下调整时 if (h[i] < h[i * 2])//判断他和他左孩子的关系,记录较小节点的编号 t = i * 2; else t = i; if (i * 2 + 1 <= n) {//如果有右孩子的话 if (h[t] < h[i * 2 + 1]) t = i * 2 + 1; } if (t != i) {//如果最小的编号不是自己,就进行交换 swap(t, i); i = t;//更新编号 } else flag = 1;//否则不需要再调整了 } }void creat() {//建堆
int i;
for (i = n / 2; i >= 1; i--) {//从最后一个非叶节点开始(就是第n/2)
siftdown(i);
}
}
void heapsort() {//堆排序
while (n > 1) {
swap(1, n);
n--;
siftdown(1);
}
}
int main() {
int i, num;
cin >> num;
for (i = 1; i <= num; i++)
cin >> h[i];
n = num;
creat();
heapsort();
for (i = 1; i <= num; i++)
cout << h[i] << " ";
return 0;
}
输入数据进行验证:
14
99 5 36 7 22 17 46 12 2 19 25 28 1 92
结果:
1 2 5 7 12 17 19 22 25 28 36 46 92 99
相关文章推荐
- POJ 1088 滑雪(记忆化搜索)
- android中加载第二个布局之LayoutInflater
- 【转载】广告计算——平滑CTR
- nrf52官方串口例程
- 基础2
- 重建二叉树(C++递归实现)
- linux shell 编程笔记 - 文件重定向
- 10026--- IO - 同步,异步,阻塞,非阻塞
- hdoj 1220 Cube(数学题)
- C/C++中的sizeof运算符
- 机房重构--职责链模式应用
- Android5.0-新特性(续)
- Linux Mint 17.2 输入法安装
- 应对Deadline,时间怎么安排?
- Maven 下 pom.xml中schema 报错
- 笔记
- hdu-1220(数学规律)
- Linux系统运维/Bash/5-3
- CentOS系统安装完毕后,网络连接方式为NAT,系统无法上网或IP设置成静态后无法上
- 由正交矩阵构建的仿射变换矩阵求逆的快速算法