#include<iostream>
using namespace std;
int PARENT(int a)//确定a的双亲 左孩子和右孩子
{
return (a-1)/2;
}
int LEFT(int a)
{
return 2*a+1;
}
int RIGHT(int a)
{
return 2*a+2;
}
void swap(int&a,int&b)//交换两个数
{
int temp=a;
a=b;
b=temp;
}
void MAX_HEAPIFY(int a[],int i,int s)//保持堆的性质 i为第i个结点 s为数组的长度
{
int largest=0;
int l=LEFT(i);
int r=RIGHT(i);
if(l<s&&a[l]>a[i])
largest=l;
else
largest=i;
if(r<s&&a[r]>a[largest])
largest=r;
if(largest!=i)
{
swap(a[i],a[largest]);
MAX_HEAPIFY(a,largest,s);
}
}
void BUILD_MAX_HEAP(int a[],int s1)//创建一个大根堆 s1为数组的长度
{
for(int j=(s1/2)-1;j>=0;j--)
MAX_HEAPIFY(a,j,s1);
}
void HEAPSORT(int a[],int s)//堆排序 s为数组的长度
{
BUILD_MAX_HEAP(a,s);
for(int i=s-1;i>=1;i--)
{
swap(a[0],a[s-1]);
s=s-1;
MAX_HEAPIFY(a,0,s);
}
}
void show(int a[],int size)
{
for(int i=0;i<size;i++)
cout<<a[i]<<' ';
cout<<endl;
}
int main()
{
int array[10]={4,1,3,2,16,9,10,14,8,7};
HEAPSORT(array,10);
show(array,10);
return 0;
}
using namespace std;
int PARENT(int a)//确定a的双亲 左孩子和右孩子
{
return (a-1)/2;
}
int LEFT(int a)
{
return 2*a+1;
}
int RIGHT(int a)
{
return 2*a+2;
}
void swap(int&a,int&b)//交换两个数
{
int temp=a;
a=b;
b=temp;
}
void MAX_HEAPIFY(int a[],int i,int s)//保持堆的性质 i为第i个结点 s为数组的长度
{
int largest=0;
int l=LEFT(i);
int r=RIGHT(i);
if(l<s&&a[l]>a[i])
largest=l;
else
largest=i;
if(r<s&&a[r]>a[largest])
largest=r;
if(largest!=i)
{
swap(a[i],a[largest]);
MAX_HEAPIFY(a,largest,s);
}
}
void BUILD_MAX_HEAP(int a[],int s1)//创建一个大根堆 s1为数组的长度
{
for(int j=(s1/2)-1;j>=0;j--)
MAX_HEAPIFY(a,j,s1);
}
void HEAPSORT(int a[],int s)//堆排序 s为数组的长度
{
BUILD_MAX_HEAP(a,s);
for(int i=s-1;i>=1;i--)
{
swap(a[0],a[s-1]);
s=s-1;
MAX_HEAPIFY(a,0,s);
}
}
void show(int a[],int size)
{
for(int i=0;i<size;i++)
cout<<a[i]<<' ';
cout<<endl;
}
int main()
{
int array[10]={4,1,3,2,16,9,10,14,8,7};
HEAPSORT(array,10);
show(array,10);
return 0;
}
31万+

被折叠的 条评论
为什么被折叠?



