排序算法(3)——堆排序简介与简单实现
好的那么堆得特性是什么呢?
堆得定义:

如下图最开始是一个小顶堆。当把97和13 交换后不是堆了,所以我们要调整根节点使之成为堆即筛选。(注意:是自堆顶到叶子的筛选过程,应该刚开始是堆由于把堆顶给换了,罪魁祸首是堆顶,其它小范围还是堆,所以是从堆顶开始)。

这其中还要注意一点。97 与13 交换后应该跟27 比较
因为是小顶堆,所以在97 的子节点里选择小者。如果把38放上去。38成了27的父节点比27大就不是小顶堆了。如果换成大顶堆就要比较把大的数据放上去。
所以程序里交换时要先要比较一下。
ok,下面是我实现的一个简单对排序算法,包括自底而上的建堆,和自上而下的小顶化。
#include <iostream>
#include <stdio.h>
using namespace std;
template <class T>
void Min_Heaped(T* arr,int heapsize,int iRoot){ //数据的最小堆化,即从根iroot开始和他的孩子做堆化
int lchild=2*iRoot;
int temp=arr[iRoot];
int bHeap=1;
while(lchild<heapsize && bHeap)
{
if (arr[lchild]>arr[lchild+1] && (lchild+1)<=heapsize)//若有分枝小,则指针移到有分枝堆化,否则直接对话指针所在的左面。
lchild++;
if (temp<arr[lchild]) //若当前根已是最小,则不做任何操作
bHeap=0;
else //否则将这个最新的小值节点升到根位置
{
arr[iRoot]=arr[lchild];
iRoot=lchild; //升完根后,要向下继续堆化下一级,直至底部
lchild=2*iRoot;
}
}
arr[iRoot]=temp; //将开始的根值放在合适的位置
}
template <class Ti>
void Build_MinHeap(Ti *arr,int heaplength){
int i;
for (i=heaplength/2;i>=1;i--)
{
Min_Heaped(arr,heaplength,i); //从i个记录开始进行筛选建堆
}
}
template <class T0>
void HeapSorted(T0 *a,int len){
int ie,tempe;
Build_MinHeap(a,len);//建最小堆
for(ie=len;ie>1;ie--){
cout<<"The top element of heap is:";
cout<<a[1]<<endl;
tempe=a[1];
a[1]=a[ie];
a[ie]=tempe;//将出堆最小元素放入临时队列中,从最后一位向前装
Min_Heaped(a,ie-1,1);
}
}
int main(){
int a[100];
int i,length;
cout<<"Input arry number:";
cin>>length;
for(i=1;i<=length;i++)
cin>>a[i];
cout<<endl;
Build_MinHeap(a,length);
cout<<"The heap elements as follows:"<<endl;
for(i=1;i<=length;i++)
cout<<a[i]<<" ";
cout<<endl;
cout<<"Heap sorted as follows: "<<endl;
HeapSorted(a,5);//此中存放的是由大到小的顺序
system("pause");
return 0;
}

浙公网安备 33010602011771号