堆排序

作者: 燃烧吧hjc | 来源:发表于2020-09-26 20:31 被阅读0次

    如有错误,欢迎指正

    #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;
    }
    

    相关文章

      网友评论

          本文标题:堆排序

          本文链接:https://www.haomeiwen.com/subject/vkdhuktx.html