c++对一含有n(n<=100)个整数的序列,使用堆排序将其由小到大(非降序)排序。 【输入形式】第一行为元素的个数n,第二行为n个整数(以空格隔开)。 【输出形式】分三行,分别输出这n个整数排序前、构造堆之后、堆排序后的序列(整数之间以逗号隔开)。 注意:构造堆需采用自底向上构造算法来构造最大堆。
时间: 2023-06-15 20:07:27 浏览: 185
对一个含有N整数的数组,使用堆排序让其由小到大输出
以下是C++代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 构造最大堆
void buildMaxHeap(vector<int>& nums) {
int n = nums.size();
for (int i = n / 2 - 1; i >= 0; i--) { // 从最后一个非叶子节点开始向下调整
int parent = i;
int leftChild = parent * 2 + 1;
while (leftChild < n) {
int rightChild = parent * 2 + 2;
int maxChild = leftChild;
if (rightChild < n && nums[rightChild] > nums[leftChild]) {
maxChild = rightChild;
}
if (nums[maxChild] > nums[parent]) {
swap(nums[parent], nums[maxChild]);
parent = maxChild;
leftChild = parent * 2 + 1;
} else {
break;
}
}
}
}
// 堆排序
void heapSort(vector<int>& nums) {
int n = nums.size();
for (int i = n - 1; i >= 1; i--) {
swap(nums[0], nums[i]); // 将当前最大值放到末尾
int parent = 0;
int leftChild = parent * 2 + 1;
while (leftChild < i) { // 从根节点开始向下调整
int rightChild = parent * 2 + 2;
int maxChild = leftChild;
if (rightChild < i && nums[rightChild] > nums[leftChild]) {
maxChild = rightChild;
}
if (nums[maxChild] > nums[parent]) {
swap(nums[parent], nums[maxChild]);
parent = maxChild;
leftChild = parent * 2 + 1;
} else {
break;
}
}
}
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
// 堆排序前
for (int i = 0; i < n; i++) {
cout << nums[i];
if (i < n - 1) {
cout << " ";
}
}
cout << endl;
// 构造最大堆
buildMaxHeap(nums);
// 构造堆后
for (int i = 0; i < n; i++) {
cout << nums[i];
if (i < n - 1) {
cout << " ";
}
}
cout << endl;
// 堆排序后
heapSort(nums);
for (int i = 0; i < n; i++) {
cout << nums[i];
if (i < n - 1) {
cout << ",";
}
}
cout << endl;
return 0;
}
```
输入示例:
```
8
3 1 4 1 5 9 2 6
```
输出示例:
```
3 1 4 1 5 9 2 6
9 5 4 6 1 3 2 1
1,1,2,3,4,5,6,9
```
阅读全文