堆排序

//功能:模范算法导论,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 10000
class 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,入过你发现有写测试数据不能通过,请通知我,共同进步!谢谢


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值