堆排序


题目描述

堆排序。

示例

  • 输入
    • 第一行输入数组元素个数
    • 第二行输入数组各个元素
  • 输出
    • 输出排序好的数组元素

示例 1

输入: 
5
9 7 5 3 1
    
输出: 
1 3 5 7 9

示例 2

输入:
6
5 15 8 12 20 2

输出:
2 5 8 12 15 20

题解

堆排序是指利用堆这种数据结构所设计的一种排序算法,是基于完全二叉树的排序方法。

堆排序的时间复杂度是 O(nlogn) 。

堆排序是不稳定的算法。

最大堆进行升序排序的算法:

  • 初始化堆:将数组 a [ 1 : n ] a[1 : n] a[1:n] 构造成最大堆。
  • 交换数据:将 a [ 1 ] a[1] a[1] a [ n ] a[n] a[n] 交换,使 a [ n ] a[n] a[n] a [ 1 : n ] a[1 : n] a[1:n] 中的最大值;然后将 a [ 1 : n − 1 ] a[1 : n - 1] a[1:n1] 重新调整为最大堆。 接着,将 a [ 1 ] 和 a [ n − 1 ] a[1] 和 a[n - 1] a[1]a[n1] 交换,使 a [ n − 1 ] a[n - 1] a[n1] a [ 1 : n − 1 ] a[1 : n - 1] a[1:n1] 中的最大值,然后将 a [ 1 : n − 2 ] a[1 : n - 2] a[1:n2] 重新调整为最大值。依次类推,直至整个数组都是有序的

若要进行降序排序,可以构建最小堆。


代码

#include <iostream>
#include <vector>

using namespace std;

vector<int> v(1);

// 构造最大堆
void max_heap(vector<int> &v, int i, int n)
{
    int j = 2 * i;
    int temp = v[i];
    while(j < n)
    {
        if(j + 1 < n && v[j] < v[j+1])
        {
            j++;
        }
        if(temp > v[j])
        {
            break;
        }
        else
        {
            v[i] = v[j];
            i = j;
            j = 2 * i;
        }
    }
    v[i] = temp;
}

void swap(int i, int j)
{
    v[0] = v[i];
    v[i] = v[j];
    v[j] = v[0];
}

// 堆排序
void heap_sort(vector<int> &v, int n)
{
    for (int i = n / 2; i >= 1; i--)
    {
        max_heap(v, i, n);
    }
    for (int i = n; i >= 1; i--)
    {
        swap(i, 1);
        max_heap(v, 1, i);
    }
}

int main()
{
    int n = 0;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> v[i];
    }
    heap_sort(v, n);

    for (int i = 1; i <= n; i++)
    {
        cout << v[i] << " ";
    }
    return 0;
}

返回顶部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值