//功能:模范算法导论,Heapify维持基本的堆排序的性质,Sort实现堆排序的的核心思想
//大致流程:
//1,调用input接受输入数据
//再调用BulidHeap来建立一个大根堆
//然后循环地把第一个数据后需要排序的最后一个数据(从iCount到2)
//交换之后,第一个位置的数据可能(还是一定)破坏了堆得性质,所谓堆得性质就是两个儿子要比自己小,否则就***
//进行维护,知道把这个数放到合适的位置上
//每一次都会取出最大的一个数,放到iCount所在位置,最后推出一个小结论,要对元素进行升序排序,那么就必须建立大根堆,降序那么就必须建立小根堆
//刚开始第一个Bug:判断左右子序列数是否比他大的时候,一直用array[i]进行比较
//the second:在找出最大的元素之后,没有对这两个元素进行交换,
//the third:在交换元素之后,应该先把iCount减1然后再调用Heapify(1),
//大致流程:
//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,入过你发现有写测试数据不能通过,请通知我,共同进步!谢谢