zoukankan      html  css  js  c++  java
  • 堆排序


    题目描述

    实现堆排序。

    示例

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

    示例 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;
    }
    
    

    返回顶部

  • 相关阅读:
    复杂网络研究的委员老师信息总合
    numpy读取本地数据和索引
    numpy数组的计算
    numpy数组的创建
    python画图的工具及网站
    matplotlib直方图
    matplotlib.legend()函数用法
    matplotlib条形图
    matplotlib散点图
    matplotlib折线图
  • 原文地址:https://www.cnblogs.com/peabits/p/10920301.html
Copyright © 2011-2022 走看看