堆排序

如有错误,欢迎指正

#include 
#include 

/*
 *  堆排序
 *  vec 待排序资源
 *  type 0 小根堆 1 大根堆
 *  size 对前 n 个进行排序
 */
void head_sort(std::vector& 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 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 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;
}

你可能感兴趣的:(堆排序)