堆中基本操作方法伪代码分析
2017-09-14 15:49
399 查看
堆其实是利用完全二叉树的结构来维护一组数据,然后进行相关操作,一般的操作进行一次的时间复杂度在O(1)~O(logn)之间。
堆的几个基本操作:
上浮 shift_up;
下沉 shift_down
插入 push
弹出 pop
取顶 top
堆排序 heap_sort
取堆顶操作:根节点数组下标必定是1,返回堆[
1 ]就OK了~~注意:每次取顶要判断堆内是否有元素;
堆排序:
堆的几个基本操作:
上浮 shift_up;
下沉 shift_down
插入 push
弹出 pop
取顶 top
堆排序 heap_sort
Shift_up( i )//i为当前节点 { while( i / 2 >= 1) { if( 堆数组名[ i ] < 堆数组名[ i/2 ] ) { swap( 堆数组名[ i ] , 堆数组名[ i/2 ]) ; i = i / 2; } else break; }
Shift_down( i , n ) //n表示当前有n个节点 { while( i * 2 <= n) { T = i * 2 ; if( T + 1 <= n && 堆数组名[ T + 1 ] < 堆数组名[ T ]) T++; if( 堆数组名[ i ] < 堆数组名[ T ] ) { swap( 堆数组名[ i ] , 堆数组名[ T ] ); i = T; } else break; }插入操作其实是每次插入的时候呢,我们都往最后一个插入,让后使它上浮。
Push ( x ) { n++; 堆数组名[ n ] = x; Shift_up( n ); }弹出操作其实是弹出堆顶元素(将堆顶元素与堆最后一个元素交换,然后利用下沉操作来维护堆)
Pop ( x ) { swap( 堆数组名[1] , 堆数组名[ n ] ); n--; Shift_down( 1 ); }
取堆顶操作:根节点数组下标必定是1,返回堆[
1 ]就OK了~~注意:每次取顶要判断堆内是否有元素;
堆排序:
Heap_sort( a[] ) { k=0; while( size > 0 ) { k++; a[ k ] = top(); pop(); } }
相关文章推荐
- nginx代码分析-基本结构-queue
- 基本算法复习之排序:性能比较、代码分析
- SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)
- Mnist进阶代码分析,Tensorboard的基本使用
- nginx代码分析-基本结构-哈希表ngx_hash_t
- 《Java & Ruby 代码分析系列》之基本的类实例对比
- 《叩响C#之门》接触窗体编程 基本知识 和 自动产生的部分代码分析(11月7日更新)
- tensorflow的一些代码分析(一) tensorflow基本流程和基本概念
- SharpDevelop代码分析 (一、序+基本概念)
- Python数据分析库pandas基本操作方法
- 蓝牙代码基本结构分析
- 【Nutch2.2.1源代码分析之5】索引的基本流程
- OC ARC之基本使用(代码分析)
- SharpDevelop代码分析 (一、序+基本概念)
- 迭代器模式分析、结构图及基本代码
- GCC Coverage代码分析-GCC插桩基本概念及原理分析
- SharpDevelop代码分析 (一、序+基本概念)
- 进程切换(context_switch)代码分析:基本逻辑
- 【安卓简易加法计算器】初学者可通过此代码学习安卓的几个基本控件,与控件的基本操作方法