c++学习连载-堆排序学习及遇到问题

原创 2013年12月04日 11:25:47

我首先写了一个heap类;

下面是一个不完整的heap类:

#include <iostream>

#ifndef _HEAP_H_
#define _HEAP_H_

using namespace std;
class heap
{
public:
    heap()
    {
    }
    int HeapPar(int i)
    {
        return i/2;
    }
    int HeapLeft(int i)
    {
        return 2*i;
    }
    int HeapRight(int i)
    {
        return 2*i+1;
    }
    template <class T>

    int getArrayLen(T& array)

    {//使用模板定义一个函数getArrayLen,该函数将返回数组array的长度

    return (sizeof(array) / sizeof(array[0]));

    }
    void InHeat(int A[]);
    void MaxHeapify(int i);
    int* Pheap;
    int HeapSize;
    ~heap()
    {
        delete [] Pheap;
    }
}
#endif

注意到没有,heap类的定义后面我没有写分号

接下来是两个成员函数的实现文件

#include"heap.h"
void heap::InHeat(int A[])
{
    HeapSize=getArrayLen(A);
    Pheap=new int[HeapSize];
}


#include"heap.h"
void heap::MaxHeapify(int i)
{
    int l,r,largest;
    int temp;
    l=HeapLeft(i);
    r=HeapRight(i);
    if((l<=HeapSize)&&(Pheap[l-1]>Pheap[i-1]))
    {
        largest=l;
    }
    else
    {
        largest=i;
    }
    if((r<=HeapSize)&&(Pheap[r-1]>Pheap[largest-1]))
    {
        largest=r;
    }
    if(largest!=i)
    {
        temp=Pheap[i-1];
        Pheap[i-1]=Pheap[largest-1];
        Pheap[largest-1]=temp;
        heap::MaxHeapify(largest);
    }
}

下面是对上面两个成员函数文件单独编译的结果:

由于类的定义少了个分号,所以会出现上面的编译错误。

另外刚开始的时候,我没有把int getArrayLen(T& array)写在类里面作为类的成员函数

而是作为全局函数在类外定义的,所以当我用类的成员函数调用它时,老报错

所以我总结了一下,类的成员函数不能调用全局函数的。

下面是完整的heap类

#include <iostream>

#ifndef _HEAP_H_
#define _HEAP_H_

using namespace std;
class heap
{
public:
    heap()
    {
    }
    int HeapPar(int i)
    {
        return i/2;
    }
    int HeapLeft(int i)
    {
        return 2*i;
    }
    int HeapRight(int i)
    {
        return 2*i+1;
    }
    template <class T>

    int getArrayLen(T& array)

    {//使用模板定义一个函数getArrayLen,该函数将返回数组array的长度

    return (sizeof(array) / sizeof(array[0]));

    }
    void InHeat(int A[]);
    void MaxHeapify(int i);
    void BuildMapHeap();
    int* Pheap;
    int HeapSize;
    ~heap()
    {
        delete [] Pheap;
    }
};
#endif


#include"heap.h"
void heap::MaxHeapify(int i)
{
    int l,r,largest;
    int temp;
    l=HeapLeft(i);
    r=HeapRight(i);
    if((l<=HeapSize)&&(Pheap[l-1]>Pheap[i-1]))
    {
        largest=l;
    }
    else
    {
        largest=i;
    }
    if((r<=HeapSize)&&(Pheap[r-1]>Pheap[largest-1]))
    {
        largest=r;
    }
    if(largest!=i)
    {
        temp=Pheap[i-1];
        Pheap[i-1]=Pheap[largest-1];
        Pheap[largest-1]=temp;
        heap::MaxHeapify(largest);
    }
}


#include"heap.h"
void heap::InHeat(int A[])
{
    HeapSize=getArrayLen(A);
    Pheap=new int[HeapSize];
}


#include"heap.h"
void heap::BuildMapHeap()
{
    for(int i=heap::HeapSize/2;i>=1;i--)
    {
        heap::MaxHeapify(i);
    }
}

经典算法学习——堆排序

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

《算法导论》之堆排序学习心得

今天学习了《算法导论》第六章的堆排序,之前有人问我对
  • shiyanwei1989
  • shiyanwei1989
  • 2014年04月15日 20:18
  • 634

《Java编程思想》学习笔记:内部类

我们可以在一个类的创建多个内部类,相当于带了很多小弟,这些小弟总得认识自己的老大是谁吧(指向外围类对象的引用),这些小弟可以共享我的资源,同时,这些小弟都很优秀,能够独立完成我交给他们的某些工作(一个...
  • JF_1994
  • JF_1994
  • 2017年02月08日 21:08
  • 362

平时、工作、学习遇到或解决的问题(前端)

1.断词问题 2015-09-09一个词语(2到6个字) 如何每一行不断词?比如: 注意力培养 就分为了两行,这样是不行的解决方法: 设置 a {display: inline-clock;}2.两...
  • sqfbeijing
  • sqfbeijing
  • 2015年09月09日 17:15
  • 362

C++学习书籍顺序推荐(二)----如何学好C++

以下内容转载自网络,来源不详!! http://blog.csdn.net/shanzhizi 一些同学问我,如何学好C++,我没有别的办法给你们,唯一的办法就是读书,读大量的书, ...
  • shanzhizi
  • shanzhizi
  • 2012年09月20日 23:00
  • 5223

一篇关于学C++的感想(拿来与大家分享)

学计算机的如果你有耐心看下去,我敢保证这绝对是一种收获 期待爱 大师提醒: 计算机专业不是学编程,而是懂得计算机的工作原理,以及和计算机相关的学科技术。一个高手不必懂得编程,coder是最底层的人物...
  • u013255737
  • u013255737
  • 2013年12月28日 14:24
  • 1682

c++学习连载-堆排序完整程序

#include #ifndef _HEAP_H_ #define _HEAP_H_ using namespace std; class heap { public:    ...
  • hitflame
  • hitflame
  • 2013年12月06日 10:46
  • 410

学习大数据过程中遇到的问题1

首先说明下学习过程中所用到的系统及软件的版本: ubuntu16.04 jkd1.8.0_131 hadoop2.7.3 hbase1.2.5 如果在ubuntu14.04上配置hadoop...
  • a76847784
  • a76847784
  • 2017年05月02日 10:37
  • 433

我第一年的C++学习之路 —— C++学习方法不断转变

我第一年的C++学习之路 —— C++学习方法不断转变 两本让我提升的书:      对于C++,我首先想要讲讲的是《C++ Primer Plus》与《C++ Primer》这两本书,很多人讨论...
  • neicole
  • neicole
  • 2011年09月14日 07:52
  • 16764

C++学习的一些经历

闲扯C++道路的经历前言不知道会不会被骂,毕竟作为一个还不能称为精通C++的人说这些在大神面前总显得有些班门弄斧了。 周围有不少的同学朋友编程都相对比较差,感觉是缺少一些方法,我把我的历程经验贴出来,...
  • lipeng08
  • lipeng08
  • 2016年03月25日 15:36
  • 9445
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++学习连载-堆排序学习及遇到问题
举报原因:
原因补充:

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