堆排序(代码片段)
来源:互联网 发布:车牌选号软件 编辑:程序博客网 时间:2024/06/06 13:15
/* * 函数: HeapLeftChild * 参数: _i * 描述: 以_i为父节点,获取_i的节点的左孩子节点 */int HeapLeftChild(int _i){ return (2*_i+1);}/* * 函数: HeapRightChild * 参数: _i * 描述: 以_i为父节点,获取_i的节点的右孩子节点 */int HeapRightChild(int _i){ return (2*_i+2);}/* * 函数: HeapParent * 参数: _i * 描述: 以_i为孩子节点,获取_i的节点的父节点 */int HeapParent(int _i){ return (_i-1)/2;}/* * 描述: 以_i节点为父节点,维持以_i节点为子树根节点的最大堆的性质 * 递归实现 */void MaxHeapPify(int* _arr, int _i, int _len){ int _l = HeapLeftChild(_i); int _r = HeapRightChild(_i); int _max = _i; if( _l < _len && _arr[_l] > _arr[_max]){ _max = _l; } if( _r < _len && _arr[_r] > _arr[_max]){ _max = _r; } if(_max != _i){ int temp = _arr[_i]; _arr[_i] = _arr[_max]; _arr[_max] = temp; MaxHeapPify(_arr, _max, _len); }}/* * 描述: 以_i节点为父节点,维持以_i节点为子树根节点的最大堆的性质 * 循环实现 */void maxHeapPify(int* _arr, int _i, int _len){ while(1){ int _l = HeapLeftChild(_i); int _r = HeapRightChild(_i); int _max = _i; if(_l < _len && _arr[_l] > _arr[_max]) _max = _l; if(_r < _len && _arr[_r] > _arr[_max]) _max = _r; if(_max != _i){ int temp = _arr[_i]; _arr[_i] = _arr[_max]; _arr[_max] = temp; _i = _max; } else{ break; } }}void minHeapPify(int* _arr, int _i, int _len){ while(1){ int _l = HeapLeftChild(_i); int _r = HeapRightChild(_i); int _min = _i; if( _l < _len && _arr[_l] < _arr[_min]) _min = _l; if( _r < _len && _arr[_r] < _arr[_min]) _min = _r; if(_min != _i){ int temp = _arr[_i]; _arr[_i] = _arr[_min]; _arr[_min] = temp; _i = _min; } else{ break; } }}void BuildMaxHeap(int* _arr, int _len){ int _i = HeapParent(_len); while(_i >= 0){ MaxHeapPify(_arr, _i, _len); --_i; } }void BuildMinHeap(int* _arr, int _len){ int _i = HeapParent(_len); while(0 <= _i){ minHeapPify(_arr, _i, _len); --_i; }}void HeapSort(int* _arr, int _len){ BuildMaxHeap(_arr, _len); int _i = _len -1; while(_i > 0){ int temp = _arr[_i]; _arr[_i] = _arr[0]; _arr[0] = temp; maxHeapPify(_arr, 0, _i); --_i; }}
0 0
- 堆排序(代码片段)
- 代码片段(快速排序)
- 归并排序(代码片段)
- 计数排序(代码片段)
- 堆排序代码
- 堆排序Java代码
- 堆排序《代码》
- 堆排序 经典代码
- 堆排序代码
- 堆排序详细代码
- 堆排序+代码实现
- 堆排序练习代码
- C++堆排序代码
- 堆排序代码
- 堆排序代码实现
- 堆排序JAVA代码
- 堆排序代码
- 堆排序算法代码
- expected expression before '=' token 问题
- C++ 类的静态成员详细讲解
- 监听editText字数计数并显示
- Virtualbox linux设置共享文件夹
- CI学习之数据传递
- 堆排序(代码片段)
- win10下安装mysql5.7
- 调试器工作原理(1):基础篇
- MYSQL基本操作
- 远程抓取图片
- 异步请求工具类NetTool
- sql语句出现键值对冲突的解决
- eclipse中常用的快捷键
- 状态模式