php 堆排序

<?php


$arr = [2, 1, 7, 4, 3, 10, 8, 6,9,18,76];
echo json_encode(getRes($arr));exit;

function getRes($arr) {
    if (empty($arr)) {
        return [];
    }

    $len = count($arr);


    for ($j=$len-1; $j>0; $j--) {
        heapAdjust($arr, $j);
        swap($arr[0], $arr[$j]);
    }

    //这一步很关键,因为上面多交换了一次
    swap($arr[0], $arr[$j+1]);

    return $arr;
}

function heapAdjust(& $arr, $end) {
    $start = intval(($end-1)/2);
    for ($i=$start; $i>=0; $i--) {
        if (2*$i+1 < $end) {
            if ($arr[$i] < $arr[2*$i+2]) {
                swap($arr[$i], $arr[2*$i+2]);
            }
        }
        if (2*$i+1 < $end) {
            if ($arr[$i] < $arr[2*$i+1]) {
                swap($arr[$i], $arr[2*$i+1]);
            }
        }
    }
}

function swap( & $a, &$b) {
    $tmp = $a;
    $a = $b;
    $b = $tmp;
}



























exit;

//求解2^1000
//2^10
var_dump(getRes1(125, 2));

function getRes1($num1, $num2) {
    if ($num1 == 0 || $num2 == 0) {
        return 0;
    }

    //123
    //456

    $str1 = strrev(strval($num1));
    $str2 = strrev(strval($num2));

    $flag = 0;
    $len1 = strlen($str1);
    $len2 = strlen($str2);

    $sum = [];
    for($i=0; $i<$len1;$i++) {
        $value = 0;
        for($j=0; $j<$len2;$j++) {
            $val1 = $str1[$i] ?? 1;
            $val2 = $str2[$j] ?? 1;
            if ($val1 * $val2 + $flag >= 10) { //需要进位
                $tmp = $val1 * $val2 + $flag;
                $flag = intval($tmp/10);
                $value = $value*10 + $tmp%10;
            } else {
                $value = $value*10 + $val1 * $val2 + $flag;
                $flag = 0;
            }
            var_dump($value, $i, $j, '-----');
        }
        $sum[] = strrev($value);
    }

    $res = $sum[0];
    for($i=1; $i<count($sum); $i++) {
        $res = getSum($res, $sum[$i]. '0');
    }

    return $res;
}

function getSum($num1, $num2) {
    $str1 = strrev(strval($num1));
    $str2 = strrev(strval($num2));

    $flag = 0;
    $len1 = strlen($str1);
    $len2 = strlen($str2);

    $sum = 0;
    $i = 0;
    $j = 0;
    while($i<$len1 || $j < $len2) {
        $val1 = $str1[$i] ?? 0;
        $val2 = $str2[$j] ?? 0;
        if ($val1 + $val2 + $flag >= 10) { //需要进位
            $tmp = $val1 + $val2 + $flag;
            $flag = intval($tmp/10);
            $sum += $tmp%10;
        } else {
            $sum += $val1 + $val2 + $flag;
            $flag = 0;
        }

        $sum *= 10;

        $i++;
        $j++;
    }

    return strrev(strval($sum));
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值