PHP实现常见排序算法的示例代码
吾爱主题
阅读:214
2022-11-10 16:07:00
评论:0
1、冒泡排序
两两相比,每循环一轮就不用再比较最后一个元素了,因为最后一个元素已经是最大或者最小。
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function maopaoSort ( $list ) { $len = count ( $list ); for ( $i = 0; $i < $len - 1; $i ++) { for ( $j = 0; $j < $len - $i - 1; $j ++) { if ( $list [ $j ] > $list [ $j + 1]) { $tmp = $list [ $j ]; $list [ $j ] = $list [ $j + 1]; $list [ $j + 1] = $tmp ; } } } return $list ; } |
2、选择排序
选定一个作为基本值,剩下的和这个比较,然后调换位置。
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | function xuanzeSort ( $list ) { $len = count ( $list ); for ( $i = 0; $i < $len - 1; $i ++) { $pos = $i ; for ( $j = $i + 1; $j < $len ; $j ++) { if ( $list [ $pos ] > $list [ $j ]) { $pos = $j ; } } if ( $pos != $i ) { $tmp = $list [ $pos ]; $list [ $pos ] = $list [ $i ]; $list [ $i ] = $tmp ; } } return $list ; } |
3、快速排序
原理就是拿出一个标尺值,然后分为左右两个数组,分别对比
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function kuaisuSort ( $list ) { $len = count ( $list ); if ( $len <= 1) { //递归出口 return $list ; } $base = $list [0]; //选择一个比较值 $leftList = $rightList = []; for ( $i = 1; $i < $len ; $i ++) { if ( $base > $list [ $i ]) { $leftList [] = $list [ $i ]; } else { $rightList [] = $list [ $i ]; } } //递归分别再处理左右两边的数组 $leftList = kuaisuSort( $leftList ); $rightList = kuaisuSort( $rightList ); return array_merge ( $leftList , [ $base ], $rightList ); } |
4、插入排序
假设前面的数都是排好顺序的,要把第n个数插入到有序里
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function charuSort ( $list ) { $len = count ( $list ); for ( $i = 1; $i < $len ; $i ++) { $tmp = $list [ $i ]; //获取对比元素 for ( $j = $i - 1; $j > 0; $j --) { if ( $list [ $j ] > $tmp ) { $list [ $j + 1] = $list [ $j ]; $list [ $j ] = $tmp ; } else { break ; } } } return $list ; } |
补充
当然PHP还能实现其他的常见排序算法,如归并排序、希尔排序、堆排序等
归并排序
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /** * 归并排序 * * @param array $lists * @return array */ function merge_sort( array $lists ) { $n = count ( $lists ); if ( $n <= 1) { return $lists ; } $left = merge_sort( array_slice ( $lists , 0, floor ( $n / 2))); $right = merge_sort( array_slice ( $lists , floor ( $n / 2))); $lists = merge( $left , $right ); return $lists ; } function merge( array $left , array $right ) { $lists = []; $i = $j = 0; while ( $i < count ( $left ) && $j < count ( $right )) { if ( $left [ $i ] < $right [ $j ]) { $lists [] = $left [ $i ]; $i ++; } else { $lists [] = $right [ $j ]; $j ++; } } $lists = array_merge ( $lists , array_slice ( $left , $i )); $lists = array_merge ( $lists , array_slice ( $right , $j )); return $lists ; } |
希尔排序
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /** * 希尔排序 标准 * * @param array $lists * @return array */ function shell_sort( array $lists ) { $n = count ( $lists ); $step = 2; $gap = intval ( $n / $step ); while ( $gap > 0) { for ( $gi = 0; $gi < $gap ; $gi ++) { for ( $i = $gi ; $i < $n ; $i += $gap ) { $key = $lists [ $i ]; for ( $j = $i - $gap ; $j >= 0 && $lists [ $j ] > $key ; $j -= $gap ) { $lists [ $j + $gap ] = $lists [ $j ]; $lists [ $j ] = $key ; } } } $gap = intval ( $gap / $step ); } return $lists ; } |
堆排序
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | /** * 堆排序 * * @param array $lists * @return array */ function heap_sort( array $lists ) { $n = count ( $lists ); build_heap( $lists ); while (-- $n ) { $val = $lists [0]; $lists [0] = $lists [ $n ]; $lists [ $n ] = $val ; heap_adjust( $lists , 0, $n ); //echo "sort: " . $n . "\t" . implode(', ', $lists) . PHP_EOL; } return $lists ; } function build_heap( array & $lists ) { $n = count ( $lists ) - 1; for ( $i = floor (( $n - 1) / 2); $i >= 0; $i --) { heap_adjust( $lists , $i , $n + 1); //echo "build: " . $i . "\t" . implode(', ', $lists) . PHP_EOL; } //echo "build ok: " . implode(', ', $lists) . PHP_EOL; } function heap_adjust( array & $lists , $i , $num ) { if ( $i > $num / 2) { return ; } $key = $i ; $leftChild = $i * 2 + 1; $rightChild = $i * 2 + 2; if ( $leftChild < $num && $lists [ $leftChild ] > $lists [ $key ]) { $key = $leftChild ; } if ( $rightChild < $num && $lists [ $rightChild ] > $lists [ $key ]) { $key = $rightChild ; } if ( $key != $i ) { $val = $lists [ $i ]; $lists [ $i ] = $lists [ $key ]; $lists [ $key ] = $val ; heap_adjust( $lists , $key , $num ); } } |
到此这篇关于PHP实现常见排序算法的示例代码的文章就介绍到这了,更多相关PHP排序算法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://mp.weixin.qq.com/s/982JkD_ajT6YkzspGx6dKQ
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。