• 堆排序


    堆排序是一种选择排序,其最好,最坏,平均时间复杂度均为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]);
    }
  • 相关阅读:
    线程3 线程池和文件下载服务器
    线程 2
    线程 1
    线程间操作
    编写高质量的代码-------从命名开始
    基于.NET平台常用的框架整理
    消息队列
    我是一个线程
    linux 网络命令
    css hack比较全 --- 转
  • 原文地址:https://www.cnblogs.com/flightless/p/8587778.html
Copyright © 2020-2023  润新知