堆排序

 

/************************************************************************/
/* 堆排序法
/* 时间复杂度:O(NlogN)
/************************************************************************/

#include <stdio.h>

#define LeftChild(i) ((2 * (i)) + 1)

void HeapAdjust(int * array, int i, int N)
{
    int child;
    int temp;
    int index;
    //从该节点开始往下遍历,进行父节点与子节点的排序
    for(index = i; LeftChild(index) < N; index = child)
    {
        //得到根节点的左儿子
        child = LeftChild(index);

        /*比较左儿子和右儿子的大小,选出较大的那个*/
        //如果左儿子小于右儿子
        if(child < N - 1 && array[child] < array[child + 1])
        {
            child += 1;
        }

        //比较父节点与子节点,如果父节点小于子节点则交换
        if(array[index] < array[child])
        {
            //交换父节点与子节点
            array[index] = array[index] ^ array[child];
            array[child] = /*array[child] ^*/ array[index] ^ array[child];
            array[index] = array[index] ^ array[child];
            //temp = array[index];
            //array[index] = array[child];
            //array[child] = temp; 
        }
    }
}

void HeapSort(int * array, int N)
{
    /* 建立堆 */
    int index;
    //从原有堆中第一个非页节点开始调整
    for(index = N / 2; index >= 0; --index)
    {
        HeapAdjust(array, index, N);
    }
        
    int MaxElement;
    
    for(index = N - 1; index > 0; --index)
    {
        /*交换第一个和最后一个元素,保证最后一个元素是当前堆最大的元素
        **交换后堆的实际大小减一*/
        MaxElement = array[0];
        array[0] = array[index];
        array[index] = MaxElement;
        
        //交换后原来堆的堆序性发生变化,但是只有堆顶的堆序发生变换,因此只需要调整堆顶的堆序
        HeapAdjust(array, 0, index);
    }
}

int main()
{
    int array[10] = {10, 45, 78, 32, 89, 18, 105, 953, 243, 19};
    HeapSort(array, 10);
    int i = 0;
    int j = sizeof(array) / sizeof(int);
    while (i < j)
    {
        printf("%d     ", array[i++]);
    }
    return 0;
}

 

posted @ 2017-02-26 15:29  oscarwin  阅读(164)  评论(0编辑  收藏  举报