堆排序 : 详情点击
<?php
function heapSort($a){
$n = count($a);
if($n < 2) {
return $a;
}
for($i = intval($n/2)-1; $i >= 0; $i--) { // 构建大顶堆
downAdjust($a, $i, $n);
}
for($i = $n-1; $i > 0; $i--) { // 进行n-1次循环,完成排序
$t = $a[$i]; // 最后一个元素和第一元素进行交换
$a[$i] = $a[0];
$a[0] = $t;
downAdjust($a, 0, $i);
}
return $a;
}
function downAdjust(&$a, $parent, $n) {
$child = 2 * $parent + 1; // 左孩子
$t = $a[$parent]; // 保存父节点的值
while($child < $n) {
if($child + 1 < $n && $a[$child] < $a[$child+1]) { // 如果有右孩子,而且右孩子大于左孩子
$child++;
}
if($t >= $a[$child]) { // 父节点大于俩孩子
break;
}
$a[$parent] = $a[$child]; // 选取孩子结点的左孩子结点,继续向下筛选
$parent = $child;
$child = 2 * $parent + 1;
}
$a[$parent] = $t;
}
print_r(heapSort([49,26,35,4,65,89,77,64,63,67,63,68,8989]));
C++
leetcode 912. 排序数组
class Solution {
public:
void max_heapify(vector<int> &v, int start, int end) {
int dad = start;
int son = dad*2+1;
while(son <= end) {
if(son + 1 <= end && v[son] < v[son+1]) {
son++;
}
if(v[dad] > v[son]) {
return ;
} else {
swap(v[dad], v[son]);
dad = son;
son = son*2+1;
}
}
}
void heap_sort(vector<int> &v, int len) {
for(int i = len/2-1; i >= 0; i--) {
max_heapify(v, i, len-1);
}
for(int i = len-1; i > 0; i--) {
swap(v[0], v[i]);
max_heapify(v, 0, i-1);
}
}
vector<int> sortArray(vector<int>& nums) {
heap_sort(nums, nums.size());
return nums;
}
};

869

被折叠的 条评论
为什么被折叠?



