zoukankan      html  css  js  c++  java
  • 堆排序-----数据结构

         堆排序
    前不久,我们数据结构刚刚学习到,堆排序。个人觉得堆排序比较好,因为比较稳定的时间复杂度。n(logn) 时间复杂度。
           如果想要学会堆排序,需要知道,二叉树。堆就和二叉树长的一模一样。

    下面说说堆排序:
    堆排序的思想就是用到堆的特点, 大顶堆,小顶堆,简单说,
          大顶堆就是:这一棵完全二叉树的任意一个节点都满足该节点的值大于等于他的左右孩子节点,
          小顶堆: 一棵完全二叉树的任意一个节点都满足该节点的值小于等于他的左右孩子节点,
    因为这棵树的根节点是这棵树(堆) 中,如果是大顶堆就是max,小顶堆就是min,

    比如我已大顶堆为例讲一下,大顶堆的个人根节点是最大值,只需要将根节点与最后一个数换一下,然后,把最后一个数除开不看,剩下的n-1个数字也是一棵完全二叉树,再将这棵树维护成大顶堆,不断重复到最后,就排好序了。

    这样便得到一个虫小到大的数组。OVER

    /******************
           Heap Sort
    ******************/
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    
    using namespace std;
    
    
    void BigHeap(int *a,int i,int len)//维护堆
    {
        int l=(i<<1)+1,r=(i<<1)+2;
        int temp=a[i],flag=0;
        if(i<len/2)
        {
            if(l<len&&a[l]>temp)
            {
                flag=l;
                temp=a[l];
            }
            if(r<len&&a[r]>temp)
            {
                flag=r;
            }
        }
        if(flag)
        {
            swap(a[i],a[flag]);
            BigHeap(a,flag,len);
        }
    }
    
    void BuildHeap(int *a,int len)// 构建初始堆
    {
        for(int i=len/2-1; i>=0; i--)
        {
            BigHeap(a,i,len);
        }
    }
    void HeapSort(int *a,int len)
    {
        BuildHeap(a,len);
        for(int i=len; i>0; i--)
        {
            swap(a[0],a[i-1]);
            BigHeap(a,0,i-1);
        }
    }
    
    int main()
    {
        int n;
        while(cin>>n)
        {
            int a[1000];
            for(int i=0; i<n; i++)
                cin>>a[i];
            HeapSort(a,n);
            int flag=0,tp=a[0];
            for(int i=1; i<n; i++)
            {
                if(a[i]<a[i-1])
                {
                    flag=1;
                    break;
                }
            }
            //for(int i=0;i<n;i++)
            if(flag) printf("erorr
    ");
            else printf("Accepted
    ");
        }
        return 0;
    }
    


  • 相关阅读:
    Ruby笔记四(数组)
    中央直属企业名单【中国级别最高的169家企业】(转)找工作按这个来
    循环pthread_create导致虚拟内存上涨(续1)
    除掉行数小程序
    client comserver编译配置运行详细说明
    网络监听技术概览(转待看)
    查看 linux系统版本,内核,CPU,MEM,位数的相关命令(实验)
    项目中Shell脚本说明(待完善)
    多线程 or 多进程 (实验1)
    循环pthread_create导致虚拟内存上涨(续2)
  • 原文地址:https://www.cnblogs.com/coded-ream/p/7207976.html
Copyright © 2011-2022 走看看