代码如下:
//1.先将数组里的数字调整为大根堆(父节点均大于两个子节点)--由第一个非叶子节点开始
//第一个叶子节点是len/2,所以非叶子节点位len/2-1
//2.将根节点和最后一个结点进行交换,再将剩下的节点调整为大根堆,依此类推,直到将数组中的数字从小到大排好序
void HeapAdjust(int* nums, int start, int end)//调整为大根堆
{
int temp = nums[start];//第一个非叶子节点作为start
for (int i = 2 * start + 1; i <= end; i = i * 2 + 1)//由它的左节点开始
{
if (i < end && nums[i] < nums[i + 1])//如果它的左节点<右节点,则此时右节点的下标为i
{
i++;
}
if (nums[i] > temp)//左右节点中最大的数>父节点,就将两个交换
{
nums[start] = nums[i];//将子节点给父节点
start = i;
}
else
{
break;
}
}
nums[start] = temp;//将原来的父节点给子节点
}
void HeapSort(int* nums, int len)//将调整好的大根堆按由小到大的顺序进行排序
{
//第一次建立大根堆,从后往前依次调整
for (int i = (len - 1 - 1) / 2; i >= 0; i--)//从第一个非叶子节点开始
{
HeapAdjust(nums , i, len - 1);
}
int temp;
for (int i = 0; i < len - 1; i++)//调整好大根堆之后根节点是最大的
{
temp = nums[0];//将根节点和最后一个节点的值进行交换
nums[0] = nums[len - 1 - i];
nums[len - 1 - i] = temp;
HeapAdjust(nums, 0, len - 1 - i - 1);//将剩下的节点再次调整为大根堆
}
}
int main()
{
int n, nums[200];
cout << "输入元素的个数" << endl;
cin >> n;
cout << "依次输入数字" << endl;
for (int i = 0; i < n; i++)
{
cin >> nums[i];
}
HeapSort(nums, n);
cout << "堆排序后的结果" << endl;
for (int i = 0; i < n; i++)
{
cout << nums[i] << " ";
}
cout << endl;
}