【数据结构】堆、堆排序笔记
来源:互联网 发布:网络黑白txt下载 编辑:程序博客网 时间:2024/05/19 13:23
【数据结构】堆、堆排序笔记
堆是一棵完全二叉树,树的每个结点的值都不小于(或者不大于)其左右孩子的值。
父亲结点大于等于孩子结点的值叫做大顶堆,反之叫做小顶堆
大顶堆的每个结点的值都是以它为根结点的子树的最大值,反之最小值
下面都以大顶堆为例子:
两个兄弟之间不存在大小比较关系,堆只能说明某结点引导的子树的所有子结点都比它小,就像领导关系一样,下属之间或者领导之间可能有实力高低,但是领导是他的所有下属的最高级
建堆:把所有非叶子结点都向下调整(从n/2开始直到1)
void createHeap() {for(int i = n / 2; i >= 1; i--) downAdjust(i, n);}
向下调整:(不断和自己的左右孩子比较,把孩子的最大值和自己交换,直到结点的下标大于最后一个元素的数组下标high为止。记住:i结点的左孩子j结点满足j = i * 2;)
const int maxn = 100;int heap[maxn], n = 10;//对heap数组在[low, high]范围进行向下调整,其中low为欲调整的结点的数组下标,high一般为堆的最后一个元素的数组下标void downAdjust(int low, int high) {int i = 1ow, j = i * 2;//i为将要调整的结点,j为它的左孩子while(j <= high) { if(j + 1 <= high && heap[j + 1] > heap[j]) j = j + 1; //那就让j存储数值最大的那个结点所对应的下标 if(heap[j] > heap[i]) { swap(heap[i], heap[j]); i = j; j = i * 2; } else { break; }}}
删除堆顶元素(用最后一个元素覆盖堆顶元素,然后让n- -,然后向下调整)
void deleteTop() {heap[1] = heap[n--];downAdjust(1, n);}
增加一个元素(添加到最后一个结点的后面,然后进行向上调整操作)
void insert(int x) {heap[++n] = x;upAdjust(1, n);}
向上调整操作就是把将要调整的结点与父亲结点比较,如果权值比父亲结点大,那么就交换其与父亲结点,这样反复比较,直到到达堆顶或者是父亲结点的权值比较大为止
void upAdjust(int low, int high) {//low一般传入1,high为将要调整的结点的数组下标int i = high, j = i / 2; //i为将要调整结点,j为其父亲while(j >= low) { if(heap[j] < heap[i]) { swap(heap[j], heap[i]); i = j; j = i / 2; } else { break; }}}
堆排序:
- 在建堆完毕后,堆排序就是取出堆顶元素,然后将堆的最后一个元素i替换至堆顶,再进行一次针对堆顶元素1向下调整(1, i - 1)范围,直到堆中只有一个元素为止(i == 2)
void heapSort() {createHeap();for(int i = n; i >= 2; i--) { swap(heap[i], hea[1]); downAdjust(1, i - 1);}}
0 0
- 【数据结构】堆、堆排序笔记
- 《数据结构复习笔记》--堆和堆排序
- 数据结构 二叉堆 & 堆排序
- 【数据结构】堆与堆排序
- 数据结构-排序-堆排序
- 数据结构--堆排序
- 【数据结构】堆排序
- 数据结构_堆排序
- 数据结构 - 堆排序
- 数据结构--堆排序
- C++数据结构--堆排序
- 数据结构之堆排序
- 数据结构之堆排序
- 【数据结构&&算法】堆排序
- 【数据结构】堆排序
- [数据结构]堆排序
- 【数据结构】堆排序
- 数据结构-堆排序
- Android Studio NDK 入门教程(3)--Java与C++之间的类型签名
- 使用CooCox的CoIDE打开mbed项目失败:提示 The chip:STM32F103RB information of current project has sonething wrong
- 猎豹浏览器访问webapp报HTTP405错误
- MapReduce 杂记
- 面试题29:找到数组中出现次数超过一半的数字(java)
- 【数据结构】堆、堆排序笔记
- Java基础之(三十五)输入输出<一>
- JAVA 网络编程(6) Netty TCP 示例
- Qt中QLabel的字符串连接
- js判断浏览器 微信
- jdbc连接oracle数据库
- C compiler cannot create executables checking whether the C compiler works... no
- 接入了微信分享,在分享页面点击返回应用,无法返回到自己的app
- win10如何启用administrator账户方法