# 算法 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) ```