算法整理
一、排序
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; }