php排序算法?php排序经典算法
1.冒泡算法,排序算法,由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序,实例代码如下:
$array = array (a,f,c,b,e,h,j,i,g); //开源代码phpfensi测试数据 function maopao_fun( $array ){ if ( $len <= 1) { return $arr ; } $count = count ( $array ); for ( $i =0; $i < $count ; $i ++){ for ( $j = $count -1; $j > $i ; $j --){ if ( $array [ $j ] > $array [ $j -1]){ $tmp = $array [ $j ]; $array [ $j ] = $array [ $j -1]; $array [ $j -1] = $tmp ; } } } return $array ; }2.快速排序
快速排序(Quicksort)是对冒泡排序的一种改进,由C. A. R. Hoare在1962年提出,它的基本思想是,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行.以此达到整个数据变成有序序列,实例代码如下:
function quickSort( $arr ){ $len = count ( $arr ); if ( $len <= 1) { return $arr ; } $key = $arr [0]; $left_arr = array (); $right_arr = array (); for ( $i =1; $i < $len ; $i ++){ if ( $arr [ $i ] <= $key ){ $left_arr [] = $arr [ $i ]; } else { $right_arr [] = $arr [ $i ]; } } $left_arr = quickSort( $left_arr ); $right_arr = quickSort( $right_arr ); return array_merge ( $left_arr , array ( $key ), $right_arr ); }3.选择排序
每一趟从待排序的数据元素中选出最小或最大的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完,选择排序是不稳定的排序方法,代码如下:
function select_sort( $arr ){ $count = count ( $arr ); for ( $i =0; $i < $count ; $i ++){ for ( $j = $i +1; $j < $count ; $j ++){ if ( $arr [ $i ] > $arr [ $j ]){ $tmp = $arr [ $i ]; $arr [ $i ] = $arr [ $j ]; $arr [ $j ] = $tmp ; } } } return $arr ; }4.插入排序
从第一个元素开始,该元素可以认为已经被排序,取出下一个元素,在已经排序的元素序列中从后向前扫描,如果该元素(已排序)大于新元素,将该元素移到下一位置,重复步骤3,直到找到已排序的元素小于或者等于新元素的位置,将新元素插入到下一位置中,重复步骤2,代码如下:
function insert_sort( $arr ){ $count = count ( $arr ); for ( $i =1; $i < $count ; $i ++){ $tmp = $arr [ $i ]; $j = $i - 1; while ( $arr [ $j ] > $tmp ){ $arr [ $j +1] = $arr [ $j ]; $arr [ $j ] = $tmp ; $j --; } } return $arr ; } $arr = array (49,38,65,97,76,13,27); print_r(insert_sort( $arr ));四种排序算法的PHP实现
1) 插入排序(Insertion Sort)的基本思想是:
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止.
2) 选择排序(Selection Sort)的基本思想是:
每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕.
3) 冒泡排序的基本思想是:
两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止.
4) 快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用,所以基本思想和上面的冒泡排序是一样的,代码如下:
?<?php /** * * @author quanshuidingdang */ class Sort { private $arr = array (); private $sort = 'insert' ; private $marker = '_sort' ; private $debug = TRUE; /** * 构造函数 * * @param array 例如: $config = array ( 'arr' => array(22,3,41,18) , //需要排序的数组值 'sort' => 'insert', //可能值: insert, select, bubble, quick 'debug' => TRUE //可能值: TRUE, FALSE ) */ public function __construct( $config = array ()) { if ( count ( $config ) > 0) { $this ->_init( $config ); } } /** * 获取排序结果 */ public function display() { return $this ->arr; } /** * 初始化 * * @param array * @return bool */ private function _init( $config = array ()) { //参数判断 if ( ! is_array ( $config ) OR count ( $config ) == 0) { if ( $this ->debug === TRUE) { $this ->_log( "sort_init_param_invaild" ); } return FALSE; } //初始化成员变量 foreach ( $config as $key => $val ) { if ( isset( $this -> $key )) { $this -> $key = $val ; } } //调用相应的成员方法完成排序 $method = $this ->sort . $this ->marker; if ( ! method_exists( $this , $method )) { if ( $this ->debug === TRUE) { $this ->_log( "sort_method_invaild" ); } return FALSE; } if ( FALSE === ( $this ->arr = $this -> $method ( $this ->arr))) return FALSE; return TRUE; } /** * 插入排序 * * @param array * @return bool */ private function insert_sort( $arr ) { //参数判断 if ( ! is_array ( $arr ) OR count ( $arr ) == 0) { if ( $this ->debug === TRUE) { $this ->_log( "sort_array(insert)_invaild" ); } return FALSE; } //具体实现 $count = count ( $arr ); for ( $i = 1; $i < $count ; $i ++) { $tmp = $arr [ $i ]; for ( $j = $i -1; $j >= 0; $j --) { if ( $arr [ $j ] > $tmp ) { $arr [ $j +1] = $arr [ $j ]; $arr [ $j ] = $tmp ; } } } return $arr ; } /** * 选择排序 * * @param array * @return bool */ private function select_sort( $arr ) { //参数判断 if ( ! is_array ( $arr ) OR count ( $arr ) == 0) { if ( $this ->debug === TRUE) { $this ->_log( "sort_array(select)_invaild" ); } return FALSE; } //具体实现 $count = count ( $arr ); for ( $i = 0; $i < $count -1; $i ++) { $min = $i ; for ( $j = $i +1; $j < $count ; $j ++) { if ( $arr [ $min ] > $arr [ $j ]) $min = $j ; } if ( $min != $i ) { $tmp = $arr [ $min ]; $arr [ $min ] = $arr [ $i ]; $arr [ $i ] = $tmp ; } } return $arr ; } /** * 冒泡排序 * * @param array * @return bool */ private function bubble_sort( $arr ) { //参数判断 if ( ! is_array ( $arr ) OR count ( $arr ) == 0) { if ( $this ->debug === TRUE) { $this ->_log( "sort_array(bubble)_invaild" ); } return FALSE; } //具体实现 $count = count ( $arr ); for ( $i = 0; $i < $count ; $i ++) { for ( $j = $count -1; $j > $i ; $j --) { if ( $arr [ $j ] < $arr [ $j -1]) { $tmp = $arr [ $j ]; $arr [ $j ] = $arr [ $j -1]; $arr [ $j -1] = $tmp ; } } } return $arr ; } /** * 快速排序 * * @param array * @return bool */ private function quick_sort( $arr ) { //具体实现 if ( count ( $arr ) <= 1) return $arr ; $key = $arr [0]; $left_arr = array (); $right_arr = array (); for ( $i = 1; $i < count ( $arr ); $i ++){ if ( $arr [ $i ] <= $key ) $left_arr [] = $arr [ $i ]; else $right_arr [] = $arr [ $i ]; } $left_arr = $this ->quick_sort( $left_arr ); $right_arr = $this ->quick_sort( $right_arr ); return array_merge ( $left_arr , array ( $key ), $right_arr ); } /** * 日志记录 */ private function _log( $msg ) { $msg = 'date[' . date ( 'Y-m-d H:i:s' ) . '] ' . $msg . 'n' ; return @ file_put_contents ( 'sort_err.log' , $msg , FILE_APPEND); } } /*End of file sort.php*/ /*Location htdocs/sort.php */ ?>查看更多关于php排序算法?php排序经典算法 - php高级应用的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did30352