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

来源:互联网 发布:软件测试报告意义 编辑:程序博客网 时间:2024/05/16 08:47

一.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


原创粉丝点击