diff --git a/blog/php-basic/algorithm.md b/blog/php-basic/algorithm.md new file mode 100644 index 0000000000000000000000000000000000000000..74ca84cdee5d4d5ebd971ad71c2a3839dad5786e --- /dev/null +++ b/blog/php-basic/algorithm.md @@ -0,0 +1,356 @@ +# 算法 algorithm + +1. 排序算法 + 1. 冒泡排序 Bubble Sort + 2. 选择排序 Selection Sort + 3. 插入排序 Insert Sort + 4. 快速排序 Quick Sort + 5. 归并排序 Merge Sort + +2. 查找算法 + 1. 顺序查找 + 2. 二分查找 + +## 冒泡排序 + +两两比较,顺序错误就交换,直到该数列已经完成排序 + +算法思路 + +比较相邻的元素,顺序不对就交换 + +代码实现 + +```php + $arr[$j + 1]){ + $temp = $arr[$j]; + $arr[$j] = $arr[$j + 1]; + $arr[$j + 1] = $temp; + } + } +} + +echo json_encode($arr); +// [1,2,3,4,6,8,9] + +``` + +## 选择排序 + +每次从待排的数据中选择最小或最大的一个元素,放在起始位置,直到全部待排序的元素排完 + +```php + $arr[$j]){ + $min = $j; + } + } + + // 5、当前值与最小值交换位置 + if($min != $i){ + $temp = $arr[$i]; + $arr[$i] = $arr[$min]; + $arr[$min] = $temp; + } +} + +echo json_encode($arr); +// [1,2,3,4,6,8,9] + +``` + +## 插入排序 + +将一个数据插入到已排序数据中 + +```php += 0; $j--){ + // 3、将该值插入到合适的位置 + if($arr[$j] > $temp){ + // 有序数组后移一位 + $arr[$j + 1] = $arr[$j]; + $arr[$j] = $temp; + } else{ + // 该值最大,位置正确 + break; + } + } +} + +echo json_encode($arr); +// [1,2,3,4,6,8,9] + +``` + +优化版本, 减少交换次数 + +```php += 0; $j--){ + // 3、将该值插入到合适的位置 + if($arr[$j] > $temp){ + // 有序数组后移一位 + $arr[$j + 1] = $arr[$j]; + // $arr[$j] = $temp; + $insert_index = $j; + } else{ + // 该值最大,位置正确 + break; + } + } + + // 如果位置有变动,交换数据 + if($insert_index > -1){ + $arr[$insert_index] = $temp; + } +} + +echo json_encode($arr); +// [1,2,3,4,6,8,9] +``` + +## 快速排序 + +不稳定排序 + +冒泡排序的改进,通过一趟排序将要排序的数据分割为独立的两部分,其中一部分的数据都比另外一部分所有数据都要小,然后重复此过程 + +排序步骤: + +1. 从数组中选出一个元素(通常是第一个),作为参照 +2. 定义两个数组,将目标数组中剩余元素与参照元素挨个比较,小的放到一组,大的放到另一组 +3. 第二步执行完后,前后数组顺序不确定,但是确定了自己的位置 +4. 将得到的小数组按照第1步第3步,重复操作(子问题) +5. 回溯最小数组(第一个元素) + +```php + $arr[$middle]){ + $left = $middle + 1; + } else if($value < $arr[$middle]){ + $right = $middle - 1; + } else{ + return $middle; + } + } + + return -1; +} + +// 有序数组 +$arr = [1, 2, 4, 8, 9, 13, 16]; + +$ret = binary_find($arr, 9); +var_dump($ret); +// float(4) + +``` \ No newline at end of file diff --git a/blog/php-basic/index.md b/blog/php-basic/index.md index 5dbf8a5be99daf3c16e746b42b68c6ec03e7ff6c..7eb4eeccca1227ad74ccf47d2eea5a6cfe293870 100644 --- a/blog/php-basic/index.md +++ b/blog/php-basic/index.md @@ -29,3 +29,5 @@ [PHP 数组相关函数](blog/php-basic/array-function.md) [编程思想](blog/php-basic/thinking.md) + +[算法 algorithm](blog/php-basic/algorithm.md) diff --git a/blog/php-basic/thinking.md b/blog/php-basic/thinking.md index 2118952ffc91a2cdf183bdf132c6c98134a84925..869d2e1df4b714bdd47decfe81762f1d86a5b052 100644 --- a/blog/php-basic/thinking.md +++ b/blog/php-basic/thinking.md @@ -57,25 +57,46 @@ function fibonacci($n){ echo fibonacci(7); // 13 ``` -https://www.bilibili.com/video/BV18x411H7qD?p=90&spm_id_from=pageDriver - - - - - - - - - +## 递归算法 +把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解 +1. 简化问题:找到最优子问题(不能再小) +2. 自己调用自己 +例如:菲波那切数列 +``` +F(N) = F(N - 1) + F(N - 2) +F(N - 1) = F(N - 2) + F(N - 3) +... +F(2) = F(1) = 1 +``` +重要点: +- 递归点:发现当前问题可以有解决当前问题的函数,去解决规模比当前小一点的问题来解决 +``` +F(N) = F(N - 1) + F(N - 2) +``` +- 递归出口:当问题解决的时候,已经到达(必须有)最优子问题,不能再次调用函数 +没有递归出口就是死循环 +递归的本质是利用空间换时间 +```php +