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

    堆排序是一种选择排序,其最好,最坏,平均时间复杂度均为O(nlogn),是一种不稳定的排序。

    首先我们来认识一下堆的结构。

    对于大顶堆,其根节点的值要大于左右孩子,小顶堆则相反。那么我们可以利用满二叉树的性质,用数组来存储堆结构。i是根节点,则左右孩子为2*i和2*i+1

    堆排序的算法顺序如下:

    1 首先建立初始大根堆。从第一个非叶子节点开始,不断调用调整堆函数。最终我们构建出一颗初始大顶堆。

    2 交换a[1]待调整堆的最后一个元素i,然后对于1到i-1进行调整堆算法。重复执行n次即可。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int a[110],n;
    void adjheap(int pos,int n)
    {
        int key=a[pos];
    
        for(int i=pos*2;i<=n;i=i*2)
        {
            if(i<n&&a[i]<a[i+1])
                i++;
            if(key<a[i])
            {
                a[pos]=a[i];
                pos=i;
            }
            else
                break;
        }
        a[pos]=key;
    }
    void sort()
    {
        for(int i=n/2;i>=1;i--)
            adjheap(i,n);
        for(int i=n;i>1;i--)
        {
            swap(a[1],a[i]);
            adjheap(1,i-1);
        }
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sort();
        for(int i=1;i<=n;i++)
            printf("%d ",a[i]);
    }
  • 相关阅读:
    P4839 P哥的桶 题解(线段树维护线性基)
    线性基入门
    Lowest Common Ancestor 题解(lca+思维)
    B
    java string对象的简单方法
    AtCoder Grand Contest 016 D
    FFT
    回文自动机(BZOJ2565)
    二维RMQ
    AC自动机(BZOJ1030)
  • 原文地址:https://www.cnblogs.com/flightless/p/8587778.html
Copyright © 2011-2022 走看看