堆排序
2010-06-22 15:28
155 查看
老实讲,这么多年,在工作中,从来没有用过堆排序,也没有借鉴过堆排序思想。主要原因是对堆排序早已经忘得一干二净。
堆排序中,首先需要理解这里所说的堆,也就是定义。不是任意一堆数任意堆起来就是堆,而是这一堆数必须满足:
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);
}
}
堆排序中,首先需要理解这里所说的堆,也就是定义。不是任意一堆数任意堆起来就是堆,而是这一堆数必须满足:
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);
}
}