堆排序算法

#include<iostream>
#include<algorithm>
using namespace std;
void MinHeapFixdown(int a[], int i, int n)//调整堆  
{  
    int j, temp;  
  
    temp = a[i];  
    j = 2 * i + 1;//i节点的左孩子节点  
    while (j < n)// 左孩子小于总数
    {  
        if (j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的 右孩子节点小于左孩子  
            j++;  //此时j是右孩子
        //没有右孩子或者右孩子大于左孩子 最小的就是左孩子
        if (a[j] >= temp)  //最小的孩子节点大于父节点 就无需调整
            break;  
        
        a[i] = a[j];     //把较小的子结点往上移动,替换它的父结点  
        i = j;//i更新为孩子节点  
        j = 2 * i + 1;  //j更新为新的i的左孩子节点
    }  
    a[i] = temp;//找到合适位置赋给a[i]
}  
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 a[100], n;
    cin>>n;
    for(int i = 0; i < n; i++)
    {
        cin>>a[i];
    }
    MakeMinHeap(a, n); 
    MinheapsortTodescendarray(a, n);
    for(i = 0; i < n; i++)
        cout<<a[i]<<' ';
    return 0;
}

 

posted @ 2017-05-11 23:02  云胡同学  阅读(136)  评论(0编辑  收藏  举报