堆排序
来源:互联网 发布:js namespace 编辑:程序博客网 时间:2024/04/26 22:04
老实讲,这么多年,在工作中,从来没有用过堆排序,也没有借鉴过堆排序思想。主要原因是对堆排序早已经忘得一干二净。
堆排序中,首先需要理解这里所说的堆,也就是定义。不是任意一堆数任意堆起来就是堆,而是这一堆数必须满足:
n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):
(1) ki≤K2i且ki≤K2i+1 或
(2)Ki≥K2i且ki≥K2i+1(1≤i≤ n)
满足性质1的称为小根堆,满足性质2的称为大根堆。可以将堆看做是完全二叉树。
堆排序的第一步是建立堆:
将任意给定的数组,首先转换成大根堆。
void heap_sort(int array_data[], int array_length)
{
create_heap_from_array(array_data, array_length); //将数组转化为堆
for(int i = (array_length -1); i>0; i--) //对大根堆而言,根的值是最大的(对小根堆,根的值是最小的)
{
int temp_value = array_data[i];
array_data[i] = array_data[0];
array_data[0] = temp_value;
heap_adjust(array_data, i, 0);
}
}
void create_heap_from_array(int array_data[], int array_length)
{
for(int i = (array_length/2); i >= 0; i--)
heap_adjust(array_data, array_length, i);
}
void heap_adjust(int array_data[], int array_length, int root_index)
{
int left_index = (root_index * 2) + 1;
int right_index = left_index + 1;
int largest_index = root_index;
if((left_index < array_length) && (array_data[root_index] < array_data[left_index]))
{
largest_index = left_index;
}
if((right_index < array_length) && (array_data[largest_index] < array_data[right_index]))
{
largest_index = right_index;
}
if(largest_index != root_index)
{
int temp_value = array_data[root_index];
array_data[root_index] = array_data[largest_index];
array_data[largest_index] = temp_value;
heap_adjust(array_data, array_length, largest_index);
}
}
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 浮动图片的css实现
- 【转】Transact SQL教程(一)
- C语言运算符优先级 详细列表
- Oracle用Start with...Connect By子句递归查询
- 解决 ie 不能识别 div 中的name属性
- 堆排序
- 如何让提高网站访问速度
- Java与Flex间的通信构造
- 酒桌上的DOTA原理
- 压力管道级别如何划分
- 工业管道安全状况等级划分方法
- struts表单取值验证问题
- float && double
- C# 4.0开发体验——方法参数默认值