算法复习之堆排序

原创 2015年07月09日 14:44:11
/*
*将两个元素进行交换
*params *p ,*q待交换的两个元素的指针
*/
void swap(int *p,int *q)
{
    int temp ;
    temp = *p ;
    *p = *q ;
    *q = temp ;
}
/*
*堆向下调整
*list:堆的数组,hole:待调整的数据,len:待调整的堆的大小
*/
void HeapAdjust(int *list,int hole,int len)
{
    int lChild = 2*hole ;//左孩子
    int rChild = 2*hole+1 ;//右孩子
    int Max = hole ;//记录
    if(hole <=len/2)//如果是叶子节点则不需要调整
    {
        if(lChild<=len && list[Max] < list[lChild])//list[Max]小于左孩子
            Max = lChild ;                  //调整Max为lChild
        if(rChild<=len && list[Max] < list[rChild])//list[Max]小于右孩子
            Max = rChild ;                      //调整Max为rChild
        if(Max!=hole)           //如果孩子节点大于待调整的节点
        {
            swap(&list[Max],&list[hole]) ;  //交换孩子节点与待调整节点的值
            HeapAdjust(list,Max,len) ;  //将孩子节点的值继续向下调整
        }
    }
}
/*
*建立堆
*params list:待建立堆的数组,len:list的长度
*/
void buildHeap(int*list,int len)
{
    int i ;
    for(i = len/2;i>=1;i--) //将从最后一个非叶子节点进行向下调整
    {
        HeapAdjust(list,i,len) ;//堆的第i个节点向下调整
    }
}
/*
*堆的排序
*params list:堆,len:堆的大小
*/
void HeapSort(int*list,int len)
{
    int i ;
    buildHeap(list,len) ;//建立大顶堆

    std::cout<<"大顶堆如下所示:";
    for(i = 1;i<=len;i++)
        std::cout<<list[i]<<"  ";
    std::cout<<std::endl;
    //排序
    for(i = len;i>=1;--i)
    {
        swap(&list[1],&list[i]) ;//将大顶堆元素与数组的最后一个位置交换,即出堆
        HeapAdjust(list,1,i-1) ;//调整堆
    }
}
void testHeap()
{
    int a[] = {-1,8,5,2,4,9,0,1,6,7,3} ;//建立堆的元素从a[1.....10],a[0]保留
    HeapSort(a,10) ;
    for(int i = 1 ;i<=10;i++)
        std::cout<<a[i] <<" ";
    std::cout<<std::endl;
}
int main()
{
    testHeap() ;
    system("pause") ;
    return 0 ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

【java面试】算法篇之堆排序

一、堆的概念 堆是一棵顺序存储的完全二叉树。完全二叉树中所有非终端节点的值均不大于(或不小于)其左、右孩子节点的值。 其中每个节点的值小于等于其左、右孩子的值,这样的堆称为小根堆; 其中每个节点的值大...
  • qq_21492635
  • qq_21492635
  • 2017年06月12日 14:23
  • 496

【数据结构与算法】内部排序之三:堆排序(含完整源码)

堆排序、快速排序、归并排序(下篇会写这两种排序算法)的平均时间复杂度都为O(n*logn)。要弄清楚堆排序,就要先了解下二叉堆这种数据结构。本文不打算完全讲述二叉堆的所有操作,而是着重讲述堆排序中要用...
  • mmc_maodun
  • mmc_maodun
  • 2014年03月04日 00:01
  • 23102

堆排序算法设计与分析

堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。堆分为大根堆和小根堆,是完全二叉树。大根堆要求父结点的值大于或等于子结点的值,小根堆相反。根据大根堆...
  • secyb
  • secyb
  • 2016年05月11日 17:04
  • 1211

C语言-数据结构-堆排序(heap sort)-源代码

1. 堆排序 堆排序的定义及思想可以参考百度百科:堆排序 用一句概括,堆排序就是一种改进的选择排序,改进的地方在于,每次做选择的时候,不单单把最大的数字选择出来,而且把排序过程中的一些操作进行了记...
  • kuweicai
  • kuweicai
  • 2017年01月24日 21:07
  • 1355

算法(第四版)学习笔记之java实现堆排序

继上一篇实现基于堆的优先队列后,这次将利用上一次完成的基于堆的能够重复删除最大元素操作的优先队列来实现一种经典而优雅的排序算法,称之为堆排序。 堆排序可分为两个阶段: 1.构建堆:在堆的构建过程中...
  • l243225530
  • l243225530
  • 2015年07月26日 16:02
  • 1038

经典算法——堆排序笔试题

阿里巴巴2016研发工程师笔试选择题 1.将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列,请问在第一轮排序结束之后,数组的顺序是_____。...
  • geekmanong
  • geekmanong
  • 2016年04月21日 15:44
  • 1866

堆排序算法的改进

堆排序算法的时间复杂度为O(nlogn),一般采用上滤建堆,如果考虑用下滤建堆,不仅可以精简代码,而且时间也会更快。 //堆排序算法的改进 void siftdown(int *v, int l, i...
  • moses1213
  • moses1213
  • 2016年01月26日 21:29
  • 426

经典算法学习——堆排序

堆排序是相对其他排序稍微麻烦的排序,是一种利用堆的性质进行的选择排序。堆其实是一棵完全二叉树,只要任何一个非叶节点的关键字不大于或者不小于其左右孩子节点,就可以形成堆。堆分为大顶堆和小顶堆。由上述性质...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年02月03日 13:49
  • 2262

堆排序算法的C++实现

堆排序:n*log(n)的时间复杂度, 非稳定排序,原地排序。它的思想是利用的堆这种数据结构,堆可以看成一个完全二叉树,所以在排序中比较的次数可以做到很少。加上他也是原地排序,不需要申请额外的空间,效...
  • moxiaomomo
  • moxiaomomo
  • 2011年04月18日 15:58
  • 16932

【排序算法】堆排序原理及Java实现

1、基本思想堆是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一颗完全二叉树,根结点的值小于(或大于)两个子节点的值,同时,根节点的两个子树也分别是一个堆。 堆排序就是利用堆(...
  • jianyuerensheng
  • jianyuerensheng
  • 2016年04月27日 18:34
  • 8187
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法复习之堆排序
举报原因:
原因补充:

(最多只允许输入30个字)