zoukankan      html  css  js  c++  java
  • 数据结构-堆(应用篇)之堆排序法-C和C++的实现

    堆排序

    关于堆的内容我们已经在上一节中了解了,本节中将给出一个堆的应用-堆排序。

    关于堆的概念可以看上一节,入口:http://www.cnblogs.com/HongYi-Liang/p/7853649.html

    堆排序属于一种选择排序:

    步骤如下:

    1. 把待排序的数据构建成大顶堆(从大到小排序)。
    2. 把堆顶的数据拿出放在数组的第一个元素中。
    3. 使用下沉的方法整理堆中的数据。
    4. 循环第2,3步,直到堆中所有数据都取出来为止。

    这个算法的优缺点如下

    优点:时间复杂度低,其中建立堆最多循环了nlong2(n)/2次,时间复杂度为O(nlog2(n)),同样后面重新排序的时间复杂度为O(nlong2(n)),所以整个算法的复杂度为O(nlog2(n))。

    缺点:需要建堆,操作繁琐。

    综上所述,本排序算法适合排列大量数据时使用。


    C语言

    取出堆顶元素并把它从堆中删除:

    bool MaxHeap_getTopAndMoveIt(MaxHeap *heap,MAXHEAP_ELEM *elem)
    {
        *elem = heap->iDatas[0];
        MaxHeap_pop(heap,0);
        return true;
    }
    • MaxHeap_pop()函数为从堆中删除某个数。在上一节中讲过这里不再赘述。

    堆排序:

    bool HeapSort(MAXHEAP_ELEM buff[],int length)
    {
        int i;
        MaxHeap heap={0};
        if(length<=0)
            return false;
        MaxHeapConstructByBuffer(&heap,buff,10);
        for(i=0;i<length;i++)
        {
            MaxHeap_getTopAndMoveIt(&heap,&buff[i]);
        }
        MaxHeapDesturct(&heap);
        
        return true;
    }
    • MaxHeapConstrucByBuffer()函数的作用是把buff[]中的数据建立成堆。在上一节中讲过这里不再赘述。
    • MaxHeap_getTopAndMoveIt()函数的作用是取出堆顶的元素并放在buff[]的最前边。在堆中,堆顶的的元素为最大值。

    测试:

    使用堆排序的方法将buffer中的数据从大到小排列:

    int main()
    {
        int i;
        int buffer[10]={0,1,2,3,4,5,6,7,8,9};
    
        HeapSort(buffer,10);
        for(i=0;i<10;i++)
        {
            printf("%d ",buffer[i]);
        }
    
        system("pause");
        return 0;
    }

    程序运行结果:

  • 相关阅读:
    [TJOI2018]教科书般的亵渎
    luogu P4781 【模板】拉格朗日插值
    [SDOI2010]捉迷藏
    [CQOI2016]K远点对
    BZOJ4066 简单题
    [国家集训队]JZPFAR
    Understanding User and Kernel Mode
    Linux下如何查看系统启动时间和运行时间以及安装时间
    CentOS Linux搭建独立SVN Server全套流程(修改svn仓库地址、服务启动等)
    linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合:
  • 原文地址:https://www.cnblogs.com/HongYi-Liang/p/7910028.html
Copyright © 2011-2022 走看看