排序——堆排序

#include <iostream>
using namespace std;

void swap( int k[], int i,int j ) 
{
    int temp;
    
    temp = k[i];
    k[i] = k[j];
    k[j] = temp;
}

void HeapAdjust( int k[], int s,int n ) 
{
    int i,temp;
    
    temp = k[s];//存放当前要调整的结点 
    
    for( i=2*s; i <= n;i*=2 )//2*s就是左孩子 2*s+1就是右孩子 i*=2表示调到下一个树
    {
        if( i < n && k[i] < k[i+1] )//确定不是最后一个结点 和 如果右孩子要大过左孩子 
        {
            i++; 
        }
        
        if( temp >= k[i])
        {
            break;
        }
        
        k[s] = k[i];
        s = i;
        
    } 
    
    k[s] = temp;
}


void HeapSort( int k[], int n )
{
    int i;
    
    for( i=n/2; i > 0;i-- ) //
    {
        HeapAdjust( k, i, n );//调整大顶堆  k表示数组 i表示双亲结点 n个数 
    } 
    
    for( i=n; i > 1;i-- )
    {
        swap(k, 1, i);//互换 元素 
        HeapAdjust( k, 1, i-1 );
    } 
}

int main()
{
    int i ,a[10] = {-1,5,2,6,0,3,9,1,7,4};
    
    HeapSort(a,9);
    
    for( i=1; i < 10 ;i++ )
    {
        cout << a[i];
    }
    
    cout << endl;
    
    return 0;
}
原文地址:https://www.cnblogs.com/xieyupeng/p/7045987.html