堆排序


题目描述

实现堆排序。

示例

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

示例 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]\)\(a[n]\) 交换,使 \(a[n]\)\(a[1 : n]\) 中的最大值;然后将 \(a[1 : n - 1]\) 重新调整为最大堆。 接着,将 \(a[1] 和 a[n - 1]\) 交换,使 \(a[n - 1]\)\(a[1 : n - 1]\) 中的最大值,然后将 \(a[1 : n - 2]\) 重新调整为最大值。依次类推,直至整个数组都是有序的

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


代码

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

返回顶部

posted @ 2019-05-24 21:31  民间程序员  阅读(110)  评论(0编辑  收藏  举报