//构造初始堆(大根堆)
void shift(int a[], int low, int high)
{
int i = low;
int j = 2 * i;//a[j]是a[i]的左孩子
int temp = a[i];
while (j <= high)
{
if (j < high&&a[j] < a[j + 1])
j++;//若右孩子较大,j指向右孩子
if (temp < a[j])
{
a[i] = a[j];//将a[j]调整到父亲节点上
i = j; //修改i和j的值,一边继续向下筛选
j = 2 * i;
}
else
break;//筛选结束
}
a[i] = temp; //被筛选结点的值放入最终位置
}
构造初始堆(大根堆)相关图
//堆排序算法
void heapsort(int a[], int n)
{
int i;
int temp;
//循环建立初始堆
for (i=n/2; i>=1; --i)
shift(a,i,n);
//选最大值后并调整堆
for (i = n ; i >= 2; --i)
{
temp = a[1];
a[1] = a[i];
a[i] = temp;
shift(a, 1, i - 1);
}
}
void main()
{
//构造初始堆时j=2*i(所以i不能为零),下面数组第一个值不算,注意求得n值
int a[10] = { 0,6,8,7,0,1,3,2,4,5 };
int n = sizeof(a)/sizeof(a[0])-1;
heapsort(a,n);
for (int i = 1; i < n+1; i++)
{
cout << a[i] << " ";
}
}