/*
* 函数: 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;
}
}
堆排序(代码片段)
最新推荐文章于 2024-02-25 16:24:46 发布