码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序算法

时间:2017-05-12 01:43:30      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:names   end   swap   节点   code   cin   最小   排序   排序算法   

#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;
}

 

堆排序算法

标签:names   end   swap   节点   code   cin   最小   排序   排序算法   

原文地址:http://www.cnblogs.com/pjc20/p/6843362.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!