算法 —— 堆排序
2015-08-27 10:31
239 查看
堆排序与快速排序,归并排序都是时间复杂度为O(N*logN) 的排序方法。在学习堆排序之前,首先讲解一下数据结构当中的二叉堆。
图一
如图一所示,就是一个二叉堆。
二叉堆满足的特性为:
1、父节点的键值总是大于或等于(小于或等于)任何一个子节点的键值
2、每个节点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)
堆排序的原理:
1、将初始数列 根据二叉堆 的特性构建成大顶堆 (即 最大值 在 第 0 的位置上)
2、设定i = n (n 为初始数列的数据总数), 将 arr[0] 与 arr[i] 交换,则最大值排到了整个序列当中的最后位置
3、i = i -1,再将 0 ~ i 之间的数据重新按照二叉堆的特性排列,又形成大顶堆。
4、重复 2 、 3 步骤,直到 i = 1,则完成了相应的排序
代码:
void
heapSortSelector(int
arr[],int
n)
{
int
i;
for
(i = n /
2
-
1; i >=
0; i --) {
heapSortArray(arr, i, n);
}
for
(i = n -
1; i >
0; i --) {
int
temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
heapSortArray(arr,
0, i);
}
}
void
heapSortArray(int
arr[],int
i,int
n)
{
int
child,temp;
for
(temp = arr[i]; i *
2
+
1
< n ;i = child ) {
child =
2
* i +
1;
if
(child < n -
1
&& arr[child] < arr[child +
1]) {
child ++;
}
if
(arr[child] > temp) {
arr[i] = arr[child];
}
else
{
break;
}
}
arr[i] = temp;
}
详细可以 参考 /article/1349065.html
图一
如图一所示,就是一个二叉堆。
二叉堆满足的特性为:
1、父节点的键值总是大于或等于(小于或等于)任何一个子节点的键值
2、每个节点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)
堆排序的原理:
1、将初始数列 根据二叉堆 的特性构建成大顶堆 (即 最大值 在 第 0 的位置上)
2、设定i = n (n 为初始数列的数据总数), 将 arr[0] 与 arr[i] 交换,则最大值排到了整个序列当中的最后位置
3、i = i -1,再将 0 ~ i 之间的数据重新按照二叉堆的特性排列,又形成大顶堆。
4、重复 2 、 3 步骤,直到 i = 1,则完成了相应的排序
代码:
void
heapSortSelector(int
arr[],int
n)
{
int
i;
for
(i = n /
2
-
1; i >=
0; i --) {
heapSortArray(arr, i, n);
}
for
(i = n -
1; i >
0; i --) {
int
temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
heapSortArray(arr,
0, i);
}
}
void
heapSortArray(int
arr[],int
i,int
n)
{
int
child,temp;
for
(temp = arr[i]; i *
2
+
1
< n ;i = child ) {
child =
2
* i +
1;
if
(child < n -
1
&& arr[child] < arr[child +
1]) {
child ++;
}
if
(arr[child] > temp) {
arr[i] = arr[child];
}
else
{
break;
}
}
arr[i] = temp;
}
详细可以 参考 /article/1349065.html
相关文章推荐
- 微信公众账号登陆授权开发——3
- kernel如何保证cache数据一致性
- 定义数组类型及数组类型指针
- 微信公众账号登陆授权开发——3
- OAuth授权过程
- Cacti无图无数据等错误解决
- Git 使用规范流程
- Codeforces 460C Present
- Android开发MVP模式解析
- uvalive 6957 Hyacinth 题目难理解
- 【Cactus仙人掌图】仙人掌DP学习笔记
- 算法 —— 归并排序
- 18条心理学定律,值得一看
- python __new__、__init__、__call__
- UITextfield键盘相关设置
- sass与compass实战(读书笔记)
- 理解POCO
- uvalive 6957 Hyacinth 题目难理解
- NSString-计算文本的长度或者宽度
- RHEL6 postfix+dovecot+mysql 邮件服务配置