oj题解-堆排序

题目描述

编写程序,实现堆排序

输入

记录个数
记录1 记录2 记录3 …,

输出

记录x1 记录x2 记录x3 …

样例输入

10
42 18 35 41 90 65 49 19 53 75

样例输出

18 19 35 41 42 49 53 65 75 90
代码如下:

#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
void siftDown(int* L, const int start, const int m)
{
    int i = start;
    int j = 2*i+1;            //j是i的左子女
    int temp=L[i];         //暂存子树根结点
    while (j <= m)       //逐层比较
    {
        if (j < m && L[j] < L[j+1])          //让j指向两子女中的大者
        {
            j++;
        }
        if (temp >= L[j])          //temp排序码大不调整
        {
            break;
        }
        else                          //否则子女中的大者上移
        {
            L[i] = L[j];
            i = j;
            j = 2*j+1;              //i下降到子女位置
        }
    }
    L[i] = temp;                 //temp放到合适位置
}
void Swap(int *a,int s,int e)
{
    int temp;
    temp=a[s];
    a[s]=a[e];
    a[e]=temp;
}
void HeapSort(int *L, int left, int right)
{
    int i, n = right - left + 1;
    for (i = (n-2)/2; i >= 0; i--)  //将表转换为堆
    {
        siftDown(L, i, n-1);
    }
    for (i = n-1; i >= 0; i--) //对表排序
    {
        Swap(L,0,i);
        siftDown(L, 0, i-1);
    }
}
int main()
{
    int n;
    cin>>n;
int a[n];
for(int i=0;i<n;i++)
    cin>>a[i];
HeapSort(a,0,n-1);
for(int i=0;i<n-1;i++)
    cout<<a[i]<<" ";
cout<<a[n-1];
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值