【排序】堆排序
程序代码:
#include<iostream>
#define MAX 1000
using namespace std;
void Sift(int* r,int size,int i);
void swap(int *num,int i,int j);
int main()
{
int num[MAX];
int n,i;
cin>>n;
for(i=1;i<=n;i++)
cin>>num[i];
for(i=(n+1)/2;i>0;i--)
Sift(num,n,i);
for(i=n;i>1;i--)
{
swap(num,1,i);
Sift(num,i-1,1);
}
for(i=1;i<=n;i++)
cout<<num[i]<<' ';
return 0;
}
void swap(int *num,int i,int j)
{
int tmp = num[i];
num[i]= num[j];
num[j]= tmp;
}
void Sift(int* r,int size,int i)//调整节点i
{
int j=2*i;//节点i的左儿子
int temp;
while(j<=size)
{
temp = r[i];
if(j<size&&r[j]<r[j+1])
j++;
if(temp<r[j])
{
r[i]=r[j];
r[j]=temp;
i=j; //继续向下调整
j=2*i;
}
else
break;
}
}
运行结果:
排序前:
排序后: