LinuxC/C++编程基础(6) 堆排序的实现

一.heap.h的声明,如下:

#ifndef HEAP_H_
#define HEAP_H_
class Heap{
public:
    Heap(){};
    ~Heap(){};
public:
    int Parent(int i);
    int Left(int i);
    int Right(int i);
    void MaxHeapify(int A[],int i);
    void BuildMaxHeap(int A[]);
    void HeapSort(int A[]);
    int HeapSize();
    void setHeapSize(int size);
    int ArraySize();
    void setArraySize(int size);
private:
    int heapsize;
    int arraysize;
};

inline int Heap::Parent(int i){
    return i / 2;
}

inline int Heap::Left(int i){
    return i << 1;
}

inline int Heap::Right(int i){
    return (i << 1) + 1;
}

inline int Heap::HeapSize(){
    return heapsize;
}

inline void Heap::setHeapSize(int size){
    heapsize = size;
}

inline int Heap::ArraySize(){
    return arraysize;
}

inline void Heap::setArraySize(int size){
    arraysize = size;
}

#endif /* HEAP_H_ */


转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8215522

二.heap.cpp的实现,如下:

#include "heap.h"
void Heap::MaxHeapify(int A[],int i){
    int l = Left(i);
    int r = Right(i);
    int largest = 0;
    if(l <= HeapSize() && A[l] > A[i]){
        largest = l;
    }else{
        largest = i;
    }
    if(r <= HeapSize() && A[r] > A[largest]){
        largest = r;
    }
    if(largest != i){
        int tmp = A[i];
        A[i] = A[largest];
        A[largest] = tmp;
        MaxHeapify(A,largest);
    }
}


void Heap::BuildMaxHeap(int A[]){
    int length = ArraySize();
    setHeapSize(length);
    for(int i=length / 2;i>0;--i){
        MaxHeapify(A,i);
    }
}


说明:含有n个元素的堆,则非叶子节点为1~n/2,这是建堆的基础,具体可用归纳法证明,这里略去!

void Heap::HeapSort(int A[]){
    int tmp = 0;
    int length = ArraySize();
    BuildMaxHeap(A);
    for(int i=length;i>1;--i){
        tmp = A[1];
        A[1] = A[i];
        A[i] = tmp;
        setHeapSize(HeapSize() - 1);
        MaxHeapify(A,1);
    }
}


转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8215522

三.main.cpp的实现,如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "heap.h"
#define ARRAYLENGTH 30
#define DEFINEARRAYLENGTH ARRAYLENGTH+1
int main(int argc,char** argv){
    int data[DEFINEARRAYLENGTH] = {-1};
    int i = 0;
    Heap heap;
    srand(time(NULL));
    for(i=1;i<=ARRAYLENGTH;++i){
        data[i] = rand() % 100;
    }
    printf("before heapsort\n");
    for(i=1;i<=ARRAYLENGTH;++i){
        printf("%d ",data[i]);
    }
    heap.setArraySize(ARRAYLENGTH);
    heap.HeapSort(data);
    printf("\n after heapsort\n");
    for(i=1;i<=ARRAYLENGTH;++i){
        printf("%d ",data[i]);
    }
    return 0;
}


说明:代码简洁明了,无需赘述

总结堆排序的过程如下:

1.建堆:即从非叶子节点开始调整堆,构建成最大堆或者最小堆,具体需要具体处理

2.排序:即不断地与堆的最大值交换排序(这里以最大堆为例)

转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8215522


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值