堆排序

来源:互联网 发布: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);
    }

}

 

原创粉丝点击