如有错误,欢迎指正
#include <iostream>
#include <vector>
/*
* 堆排序
* vec 待排序资源
* type 0 小根堆 1 大根堆
* size 对前 n 个进行排序
*/
void head_sort(std::vector<int>& vec, int32_t size, int32_t type) {
// 升序 一般使用大根堆
// 降序 一般使用小根堆
// why :
// 从简单的角度考虑,index为0作为根节点较为好处理
// 每次最大的数都和末尾的数交换,即可达到最终的排序效果
if (size <= 1) {
return;
}
for (int32_t i = (size - 2) / 2; i >= 0; --i) {
std::vector<int32_t> index_vec = {2 * i + 1, 2 * i + 2};
for (auto index : index_vec) {
if (index < size) {
if (vec[i] > vec[index] && type == 0 || vec[i] < vec[index] && type == 1) {
int32_t tmp = vec[i];
vec[i] = vec[index];
vec[index] = tmp;
}
}
}
}
std::swap(vec[0], vec[size - 1]);
head_sort(vec, size - 1, type);
}
int32_t main() {
std::vector<int> nums;
std::string num;
std::string input;
std::getline(std::cin, input);
for (int32_t i = 0; i < input.size(); ++i) {
if (input[i] < '0' || input[i] > '9') {
nums.emplace_back(stoi(num));
num.clear();
continue;
}
num.push_back(input[i]);
}
if (!num.empty()) {
nums.emplace_back(stoi(num));
}
head_sort(nums, nums.size(), 0);
for (int32_t i = 0; i < nums.size(); ++i) {
std::cout << nums[i] << " ";
}
std::cout << std::endl;
}