代码如下:
//1.先将数组里的数字调整为大根堆(父节点均大于两个子节点)--由第一个非叶子节点开始
//第一个叶子节点是len/2,所以非叶子节点位len/2-1
//2.将根节点和最后一个结点进行交换,再将剩下的节点调整为大根堆,依此类推,直到将数组中的数字从小到大排好序void HeapAdjust(int* nums, int start, int end)//调整为大根堆
{int temp = nums[start];//第一个非叶子节点作为startfor (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;}