堆排序

#ifndef HEAPSORT_H
#define HEAPSORT_H

#include <iostream>
using namespace std;


/*************************************************
Function:       // build_heap
Description:    // 堆性质维护函数
Input:          // array:输入待排序数组
                // num: 待处理数组元素位置
                // size: 数组长度
Output:         // 无
Return:         // 无
*************************************************/
template<class T> void heap_maintaince(T *array, int size, int num)
{
    int left_child = num * 2;
    int right_child = num * 2 + 1;
    int max_index = num;
    T temp;
    if(left_child <= size && array[left_child - 1] > array[num - 1])
    {
        max_index = left_child;
    }
    if(right_child <= size && array[right_child - 1] > array[max_index - 1])
    {
        max_index = right_child;
    }
    if(max_index != num)
    {
        temp = array[num - 1];
        array[num - 1] = array[max_index - 1];
        array[max_index - 1] = temp;
        heap_maintaince(array, size, max_index);
    }
    else
    {
        return;
    }
}

/*************************************************
Function:       // build_heap
Description:    // 创建堆
Input:          // array:输入待排序数组
                // num: 数组长度
Output:         // 无
Return:         // 无
*************************************************/
template<class T> void build_heap(T *array, int num)
{
    int i;
    for(i = num / 2; i > 0; --i)
    {
        heap_maintaince(array, num, i);
    }
#ifdef _DEBUG
    for(i = 0; i < num; ++i)
    {
        cout << array[i] << " ";
    }
    cout << endl;
#endif // _DEBUG    
}

/*************************************************
Function:       // build_heap
Description:    // 排序
Input:          // array:输入待排序数组
                // num: 数组长度
Output:         // 无
Return:         // 无
*************************************************/
template<class T> void heap_sort(T *array, int num)
{
    build_heap(array, num);
    int i;
    T temp;
    for(i = num; i >= 2;)
    {
        temp = array[0];
        array[0] = array[i - 1];
        array[i - 1] = temp;
         --i;
        heap_maintaince(array, i, 1);
    }
}

#endif

堆积排序(Heapsort)是指利用堆积树(堆)来设计的一组排序算法,在其中最主要的是如何保持队性质的函数heap_maintaince。算法导论里边有比较详细易懂的叙述。

参考文献:算法导论。

posted on 2013-03-25 11:19  blue firmament  阅读(129)  评论(0编辑  收藏  举报