非递归:
#include<iostream>
using namespace std;
void heapAdjust(int *a,int s,int len)
{
int temp=a[s];
for(int j=2*s;j<=len;j*=2)
{
if(j<len && a[j]<a[j+1])
j++;
if(a[j]>temp)
{
a[s]=a[j];
s=j;
}
else
break;
}
a[s]=temp;
}
void heapSort(int *a,int len)
{
for(int i=len/2;i>=1;i--)
{
heapAdjust(a,i,len);
}
for(int i=len;i>1;i--)
{
swap(a[1],a[i]);
heapAdjust(a,1,i-1);
}
}
int main()
{
int a[10]={0,10,25,8,18,22,4,12};
heapSort(a,7);
return 0;
}
递归:
方式1:
#include<iostream>
using namespace std;
//flag为false说明第一次的大顶堆还未建立成功
void heapAdjust(int *a,int s,int end,bool flag)
{
int tmp=a[s];int n=s;
for(int j=2*s;j<=end;j*=2)
{
if(j<end && a[j]<a[j+1])
j++;
if(a[j]<tmp)
break;
a[s]=a[j];s=j;
}
a[s]=tmp;s=n;
if(flag==false && s>1)
heapAdjust(a,s-1,end,flag);
if(s==1)
{flag=true;s=end;}
if(flag && s>1)
{
swap(a[1],a[s]);
heapAdjust(a,1,s-1,flag);
}
}
int main()
{
int a[10]={0,10,25,8,18,22,4,12,1};
int len=8; //最后一个元素的下标
bool flag=false;
heapAdjust(a,len/2,len,flag);
return 0;
}
方式2:
#include<iostream>
using namespace std;
void heapAdjust(int *a,int s,int j,int temp,int end)
{
if(j<=end)
{
if(j<end && a[j]<a[j+1])
j++;
if(a[j]<=temp)
{
a[s]=temp; return;
}
else
{
a[s]=a[j];
heapAdjust(a,j,2*j,temp,end);
}
}
else
{
a[s]=temp;return;
}
}
void heapSort(int *a,int len) //len 为最后一个元素的下标
{
for(int i=len/2;i>=1;i--)
heapAdjust(a,i,2*i,a[i],len);
for(int i=len;i>1;i--)
{
swap(a[1],a[i]);
heapAdjust(a,1,2,a[1],i-1);
}
}
int main()
{
int a[10]={0,10,25,8,18,22,4,12,1};
heapSort(a,8);
return 0;
}