堆排序

#include "stdafx.h"
#include <iostream>
#include <assert.h>
using namespace std;

//对于a来说,除了a[s]之外均满足大顶堆的定义
// 该函数将下标 s到m 调整为大顶堆
void heapAdjust(int* a,int s, int m)
{
    int temp = a[s];
    // 下标从0开始,则两个孩子分别为 2*i+1 和 2*i+2
    for(int j=2*s+1; j<=m; j=j*2+1)
    {
        // 执行完成后j中保存了两个孩子中较大的孩子的下表
        // 如果j=m,说明m是最后的左孩子
        if(j<m && a[j] < a[j+1]) 
            j++;
        if(temp>=a[j])// s就是要插入的位置
            break;
        //否则进行调整,将孩子中较大的孩子,放入s的位置
        // 并将j赋值给s
        a[s] = a[j];
        s = j;
    }
    a[s] = temp;
}


int main()
{
    int a[] = {49,38,65,97,76,13,27,49};
    int length = sizeof(a)/sizeof(a[0]);

    // 从最后一个没有孩子的节点进行调整,建立大顶推
    for(int i= (length-1)/2 ; i>=0; i--)
        heapAdjust(a,i,length-1);

    // 将堆顶元素和最后一个元素进行交换
    // 之后,重新调整堆
    // 完成之后,就是 从小到大的排序
    for(int i = length-1; i>0; i--)
    {
        int temp = a[0];
        a[0] = a[i];
        a[i] = temp;
        heapAdjust(a,0,i-1);
    }


    for(int i=0; i<length; i++)
        cout<<a[i]<<endl;
}
posted @ 2012-10-25 21:45  三更_雨  阅读(201)  评论(0编辑  收藏  举报