算法整理

一、排序

1、冒泡排序:循环比较相邻元素,将较大值往右移,第一轮循环后最右侧数值必定为最大值,故下一轮不需要比较最后一个元素,依此循环:

        $arrData = [63, 43, 98, 65, 50, 29, 85, 11, 28, 49, 100, 47, 5, 62, 24, 30, 27, 95, 93, 75];
        for ($i = 0; $i < count($arrData); $i++) {
            for ($j = 0; $j < count($arrData) - 1 - $i; $j++) {
                if ($arrData[$j] > $arrData[$j + 1]) {
                    $intTemp = $arrData[$j + 1];
                    $arrData[$j + 1] = $arrData[$j];
                    $arrData[$j] = $intTemp;
                }
            }
        }

 2、快速排序:以数组中第一个数为基准,将其他数据分为比基准值小的数组及比基准值大的数组,然后将比基准值小的数组排到基准值左边,比基准值大的数组排在基准值右边,然后按相同方式排序基准值左边的数组和右边的数组,递归下去

    private function quickSort($arrData) {
        if (count($arrData) <= 1) {
            return $arrData;
        }
        $intFlagNum = $arrData[0];
        $arrSmall = $arrLarge = [];
        $arrEqual = [$intFlagNum];
        for ($i = 1; $i < count($arrData); $i++) {
            if ($arrData[$i] < $intFlagNum) {
                $arrSmall[] = $arrData[$i];
            } else if ($arrData[$i] > $intFlagNum) {
                $arrLarge[] = $arrData[$i];
            } else {
                $arrEqual[] = $arrData[$i];
            }
        }
        $arrSmall = $this->quickSort($arrSmall);
        $arrLarge = $this->quickSort($arrLarge);
        return array_merge($arrSmall, $arrEqual, $arrLarge);
    }

 3、简单选择排序:第一趟从第一个元素开始选出最小的元素和第一个元素交换位置,第二趟从第二个元素开始选出最小的元素和第二个元素交换位置,以此类推

        $arrData = [63, 43, 98, 65, 50, 29, 85, 11, 28, 49, 100, 47, 5, 62, 24, 30, 27, 95, 93, 75];
        for ($i = 0; $i < count($arrData) - 1; $i++) {
            $intIndex = $i;
            for ($j = $i + 1; $j < count($arrData); $j++) {
                if ($arrData[$j] < $arrData[$intIndex]) {
                    $intIndex = $j;
                }
            }
            if ($intIndex != $i) {
                $intTemp = $arrData[$intIndex];
                $arrData[$intIndex] = $arrData[$i];
                $arrData[$i] = $intTemp;
            }
        }

 

二、查找

1、顺序查找:从第一个元素开始,按索引顺序遍历待查找序列,直到找出给定目标或者查找失败

    private function find($arrData, $objTarget) {
        foreach ($arrData as $intIndex => $objValue) {
            if ($objValue == $objTarget) {
                return $intIndex;
            }
        }
        return -1;
    }

2、二分查找:数组为从小到大的有序数组,取左右边界索引值的中间值对应的元素和要查找的元素进行对比,如小于要查找的值,这左侧边界取中间索引右侧的位置,如大于要查找的值,则右侧边界取中间索引左侧的位置,一直递归直到查询到要查找的值

    private function find($arrData, $intTarget) {
        $intLeft = 0;
        $intRight = count($arrData) - 1;
        while ($intLeft <= $intRight) {
            $intMid = (int) (($intRight + $intLeft) / 2);
            if ($arrData[$intMid] == $intTarget) {
                return $intMid;
            } else if ($arrData[$intMid] < $intTarget) {
                $intLeft = $intMid + 1;
            } else if ($arrData[$intMid] > $intTarget) {
                $intRight = $intMid - 1;
            }
        }
        return -1;
    }

 

posted @ 2021-06-03 14:18  fengzmh  阅读(49)  评论(0编辑  收藏  举报