堆排序

来源:互联网 发布:开票软件登录 编辑:程序博客网 时间:2024/04/30 18:30
//功能:模范算法导论,Heapify维持基本的堆排序的性质,Sort实现堆排序的的核心思想
//大致流程:
//1,调用input接受输入数据
//再调用BulidHeap来建立一个大根堆
//然后循环地把第一个数据后需要排序的最后一个数据(从iCount到2)
//交换之后,第一个位置的数据可能(还是一定)破坏了堆得性质,所谓堆得性质就是两个儿子要比自己小,否则就***
//进行维护,知道把这个数放到合适的位置上
//每一次都会取出最大的一个数,放到iCount所在位置,最后推出一个小结论,要对元素进行升序排序,那么就必须建立大根堆,降序那么就必须建立小根堆
//刚开始第一个Bug:判断左右子序列数是否比他大的时候,一直用array[i]进行比较
//the second:在找出最大的元素之后,没有对这两个元素进行交换,
//the third:在交换元素之后,应该先把iCount减1然后再调用Heapify(1),


#include <iostream>using namespace std;#define MAX_COUNT 10000class HeapSort{public:    double array[MAX_COUNT];    HeapSort();    int Input(int count);//输入数据    void Heapify(int i);    int num;//数组中元素的个数    void Print();    void BulidHeap();    void Sort();    int iCount;};HeapSort::HeapSort(){    memset(array,0,sizeof(array));    iCount = 0;}int HeapSort::Input(int count){    num = count;    iCount = count;    for(int i=1;i<=count;i++)    {        cin>>array[i];//输入数据    }    return count;}void HeapSort::Heapify(int i){    int l =i*2;    int r =i*2+1;      int largest = i;    if(l<=iCount&&array[l]>array[i])        largest = l;    if(r<=iCount&&array[r]>array[largest])//注意这里是把右边的值和当前的最大值进行比较,而并非是array[i]        largest = r;    if(largest!=i)    {        double temp = array[i];//寻找最大数的目的是为了交换数据        array[i] = array[largest];        array[largest] = temp;        this->Heapify(largest);    }}void HeapSort::Print(){    for(int i=1;i<=num;i++)    {        cout<<array[i]<<" ";    }    cout<<endl;}void HeapSort::BulidHeap(){  for(int i=num/2;i>=1;i--)  {      this->Heapify(i);  }}void HeapSort::Sort(){    for(int i=iCount;i>=2;i--)    {        double temp = array[i];        array[i] = array[1];        array[1] = temp;        iCount--;//此处应该放在前面否则在调用Heapify的时候会把最后一个数和已经放好的数进行交换,就会进行两次交换        this->Heapify(1);        //iCount--;        this->Print();    }}int main(){    HeapSort heap;    heap.Input(10);//输入十个数据    //heap.Heapify(1);    heap.BulidHeap();    heap.Sort();    heap.Print();    return 0;}



本人测试的数据只有十几组,可能存在一些小bug,入过你发现有写测试数据不能通过,请通知我,共同进步!谢谢