// 插入排序 // 实现思路:假设前面的数已经是排好顺序的,把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。 // 最大时间复杂度为O(n^2) function insertSort($arr) { $count = count($arr); for( $i = 1; $i < $count; $i++ ) { $tmp = $arr[$i]; for( $j = $i - 1; $j >= 0; $j-- ) { if($tmp < $arr[$j]) { //发现插入的元素要小,交换位置,将后边的元素与前面的元素互换 $arr[$j+1] = $arr[$j]; $arr[$j] = $tmp; } else { //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。 break; } } } return $arr; } $arr = [4,6,8,1,3,5,7,2]; print_r( insertSort( $arr ) ); // ====================================================================================================== // 选择排序 // 实现思路:选出最小数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换 // 最大时间复杂度为O(n^2) function selectSort($arr) { $count = count($arr); for ($i = 0; $i < $count - 1; $i++) { // 定义最小位置 $minIndex = $i; // 在未处理位置开始 for ( $j = $i + 1; $j < $count; $j++ ) { // 大到小排序 < ,大到小排序则> if ( $arr[$j] < $arr[$minIndex] ) { $minIndex = $j; } } // 最小位置有变化,将当前值 和 最小值 交换 if ($i != $minIndex) { $temp = $arr[$i]; $arr[$i] = $arr[$minIndex]; $arr[$minIndex] = $temp; } } return $arr; } $arr = [4,6,8,1,3,5,7,2]; print_r( selectSort( $arr ) ); // ====================================================================================================== // 快速排序 // 实现思路:把第一个元素作为标记,依次判断后面的值,小于它放在左边 大于它则放右边。然后分别把左右两个子数组进行相同的分隔 // 最大时间复杂度为O(n^2) function quickSort($arr) { $count = count($arr); // 如果个数为空或者1,则原样返回数组 if ( $count <= 1 ) return $arr; // 标记第一个元素 $index = $arr[0]; $left = []; //定义左数组 $right = []; //定义右数组 //开始和标记值作比较 for ($i = 1; $i < $count; $i++) { // 小于放进$left 大于放进$right if ($arr[$i] < $index) { $left[] = $arr[$i]; } else { $right[] = $arr[$i]; } } // 然后分别把左右两个子数组进行相同的分隔 $left = quickSort($left); $right = quickSort($right); // 从大到小排序,则array_merge( $right, [$arr[0]],$left ) return array_merge($left, [$arr[0]], $right); } $arr = [4,6,8,1,3,5,7,2]; print_r( quickSort( $arr ) ); // ====================================================================================================== // 冒泡排序 // 实现思路:比较两个相邻的元素,将值大的元素交换至右端 // 最大时间复杂度为O(n^2) function bubbleSort($arr) { $count = count($arr); for ($i = 1; $i < $count; $i++) { // 每一趟排序都会找出一个较大值,就会少比较一次 for ($j = 0; $j < $count - $i; $j++) { // 对比相邻值,将小值和大值的位置互换 // 从小到大排序就是 当前值大于下一个值时,放到右面 // 从大到小排序就是 当前值小于下一个值时,放到右面 if ($arr[$j] > $arr[$j+1]) { $temp = $arr[$j]; $arr[$j] = $arr[$j+1]; $arr[$j+1] = $temp; } } } return $arr; } $arr = [4,6,8,1,3,5,7,2]; print_r( bubbleSort( $arr ) );
php 排序插入排序,选择排序,快速排序,冒泡排序
最新推荐文章于 2021-03-19 17:01:36 发布