您的位置:首页 > 其它

堆排序

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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: