编译器:Xcode
编程语言:C++
源程序:
#include <iostream>
using namespace std;
void swap(int a[],int i,int j) //交换函数
{
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
void heapAdjust(int a[],int i,int n)
{
int temp;
//假设第一个结点的元素是最大的
temp=a[i];
//i结点:2*i是i结点的左结点,2*i+1是结点的右结点
//把结点元素大的交换到前面
for(int j=2*i;j<=n;j*=2)
{
if(j<n && a[j]<a[j+1])
j++;
if(temp>=a[j])
break;
a[i]=a[j];
i=j;
}
a[i]=temp;
}
//堆排序将数组先组成二叉树,默认从数组的a[1]开始排,a[0]是无效数据
void heapSort(int a[],int n) //堆排序
{
int i;
//先将数组组成一棵完全二叉树
//从2/n开始,就是从倒数第二排结点往前开始
for(int i=n/2;i>0;i--)
{
heapAdjust(a, i, n);
}
//循环每个结点,将大的结点交换到堆顶
for(i=n;i>1;i--)
{
swap(a,1,i);
//每次交换完都要调整二叉树,将剩下的最大结点交换到堆顶
heapAdjust(a, 1, i-1);
}
}
int main()
{
int a[11] = {-1,43, 65, 4, 23, 6, 98, 2, 65, 7, 79};
cout<<"堆排序:"<<endl;
heapSort(a, 10);
for(int i=1;i<11;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
运行结果:
堆排序:
2 4 6 7 23 43 65 65 79 98
Program ended with exit code: 0