堆排序 C++
来源:互联网 发布:java中私有属性 编辑:程序博客网 时间:2024/06/01 10:47
堆排序的的步骤(从小到大):
1. 先构建最大堆;
2. 维护一个tail,表示堆的底部,即数组中0-tail部分为堆,tail初始为nums.size()-1,tail之后的元素为已排好序的部分;
3. 将堆顶的元素与tail交换,tail减一,然后对堆顶的元素做一次down操作,重复这个步骤,直到tail为0;
#include <iostream>#include <algorithm>#include <string>#include <vector>#include <random>using namespace std;void swap(vector<int>& nums, int i, int j){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp;}void up(vector<int>& nums, int i){ int father = (i - 1) / 2; if (i > 0 && nums[i] > nums[father]) { swap(nums, i, father); up(nums, father); }}void down(vector<int>& nums, int i, int tail){ int son = i * 2 + 1; if (son > tail) return; if (son + 1 <= tail && nums[son + 1] > nums[son]) ++son; if (nums[i] < nums[son]) { swap(nums, i, son); down(nums, son, tail); }}void heapSort(vector<int>& nums, int tail){ for (int i = 0; i < nums.size(); ++i) up(nums, i); for (int i = nums.size() - 1; i > 0; --i) { swap(nums, 0, i); down(nums, 0, i - 1); }}int main(){ default_random_engine e; uniform_int_distribution<int> u(0, 1000); vector<int> nums(0); for (int i = 0; i < 20; ++i) nums.push_back(u(e)); for (int i = 0; i < nums.size(); ++i) cout << nums[i] << " "; cout << endl; heapSort(nums, nums.size() - 1); for (int i = 0; i < nums.size(); ++i) cout << nums[i] << " "; cout << endl; return 0;}
阅读全文
0 0
- 堆排序----C语言
- 堆排序(C#)
- 堆排序C语言
- HeapSort(堆排序 C++)
- c 最大堆排序
- c语言堆排序
- 堆排序(C语言版)
- 堆排序(C++)
- 【c++】堆排序算法
- 堆排序(C#)
- 堆排序(C#)
- 堆排序 ----- C语言
- C算法--堆排序
- 堆排序 C语言版
- C语言堆排序
- 堆排序c语言
- 排序算法 - 堆排序 (C++)
- 堆排序(C\C++)
- Python数据库操作(PyMysql)
- 第一阶段第三天(数据类型,运算符)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.3)
- 使用Linux系统开发php程序(如:ubuntu)
- 基于python的添加和删除安全组的脚本
- 堆排序 C++
- Filter(过滤器)
- JVM面试题
- Button相关学习
- EasyUI实现地址联动,显示默认值
- LIBRARY_PATH 和 LD_LIBRARY_PATH 的关系
- tomcat下配置https环境(windows环境)
- Win7打开文件提示快捷方式存在问题的解决方法
- rgb2ind函数