堆排序2

/*堆排序(小顶堆) 2014.4.2*/ 

#include <iostream>
using namespace std;

//在堆(已是小顶堆)的末位插入数据i后,通过
//MinHeapFixup(节点上移)函数调整为小顶堆
void MinHeapFixup(int a[], int i)  
{  
    int j, temp;        
    temp=a[i];  
    j=(i-1)/2;            //父结点  
    while(j>=0 &&i!=0)
    {  
        if (a[j]<=temp)  
            break;            
        a[i] = a[j];      //把较大的子结点往下移动,替换它的子结点  
        i = j;  
        j = (i - 1) / 2;  
    }  
    a[i] = temp;  
}  


//在最小堆中加入新的数据nNum  
void MinHeapAddNumber(int a[], int n, int i)  
{  
    a[n] = i;            //先插入数据i
    MinHeapFixup(a, n);  //从新调整为小顶堆
} 

//将小顶堆树根数据和树末位数据交换后,通过MinHeapFixdown
//(节点下移)函数将n个数据调整为小顶堆(i标示要调整的起点)
void MinHeapFixdown(int a[], int i, int n)  
{  
    int j, temp;    
    temp=a[i];  
    j = 2 * i + 1;  
    while (j<n)  
    {  
        if (j +1<n && a[j+1]<a[j]) //在左右孩子中找最小的  
            j++;  
        if (a[j]>=temp)  
            break;  
        a[i] = a[j];     //把较小的子结点往上移动,替换它的父结点  
        i=j;  
        j = 2*i+1;  
    }  
    a[i] = temp;  
}  
//在最小堆中删除数  
void MinHeapDeleteNumber(int a[], int n)  
{  
    swap(a[0],a[n-1]);             //将树根数据和树末位数据交换
    MinHeapFixdown(a,0, n-1);      //调整前n-1个数据为最小堆
} 

//建立最小堆  
void MakeMinHeap(int a[], int n)
{  
    for (int i=n/2-1;i>=0;i--)
        MinHeapFixdown(a,i,n);
}  

void MinheapsortTodescendarray(int a[], int n)  
{  
    for (int i = n - 1; i >= 1; i--)  
    {  
        swap(a[i], a[0]);  
        MinHeapFixdown(a, 0, i);  
    }  
}  

int main(int argc, char *argv[])
{
    int a[]={0,16,20,3,11,17,8,15};   //要排序的数为a[1]...a[6],a[0]不参与排序
    MakeMinHeap(a,8);
    MinheapsortTodescendarray(a,8);
    for(int i=7;i>=0;i--)             //逆序输出
        cout<<a[i]<<" ";
    cout<<endl;
    system("pause");
    return 0;
}

详细原理介绍见:http://blog.csdn.net/morewindows/article/details/6709644

原文地址:https://www.cnblogs.com/nilongqibu/p/3641538.html