<?php /* * 插入排序(一维数组) * 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。 */ function insertSort( $arr ) { if (! is_array ( $arr ) || count ( $arr )==0) { return $arr ; } $count = count ( $arr ); for ( $i =1; $i < $count ; $i ++) { if (isset( $arr [ $i ])) { $tmp = $arr [ $i ]; //获取后一个元素的值 $j = $i -1; //获取前面的下标 while ( $arr [ $j ] > $tmp ) { //如果前面一个比后面一个大, 这里是从小到大 $arr [ $j +1] = $arr [ $j ]; //把小的元素和前面的对换,直到移动到合适的位置,在移动下一个 $arr [ $j ] = $tmp ; $j --; } } } return $arr ; } /* * 选择排序(一维数组) * 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 */ function selectSort( $arr ) { if (! is_array ( $arr ) || count ( $arr ) == 0) { return $arr ; } $count = count ( $arr ); for ( $i =0; $i < $count ; $i ++) { $k = $i ; for ( $j = $i +1; $j < $count ; $j ++) { if ( $arr [ $k ] > $arr [ $j ]) $k = $j ; //找出最小的 if ( $k != $i ) { $tmp = $arr [ $i ]; $arr [ $i ] = $arr [ $k ]; $arr [ $k ] = $tmp ; } } } return $arr ; } /* * 冒泡排序(一维数组) * 两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止 */ function bubbleSort( $array ) { $count = count ( $array ); if ( $count <= 0) { return false; } 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 ; } /* * 快速排序(一维数组) * */ function quickSort( $array ) { if ( count ( $array ) <= 1) { return $array ; } $key = $array [0]; $left_arr = array (); $right_arr = array (); for ( $i =1; $i < count ( $array ); $i ++) { if ( $array [ $i ] <= $key ) { $left_arr [] = $array [ $i ]; } else { $right_arr [] = $array [ $i ]; } } $left_arr = quickSort( $left_arr ); $right_arr = quickSort( $right_arr ); return array_merge ( $left_arr , array ( $key ), $right_arr ); } /** * 按照元素的值进行排序 * strOrder 为排列的顺序 asc 升序 desc 降序 */ function sortByVal( $arr , $strOrder = 'asc' ) { if (! is_array ( $arr ) || count ( $arr )==0) { return $arr ; } $arrReturn = array (); foreach ( $arr as $key => $val ) { $arrKey [] = $key ; $arrVal [] = $val ; } $count = count ( $arrVal ); if ( $count ) { //创建key的顺序数组 for ( $key =0; $key < $count ; $key ++) { $arrKeyMap [ $key ] = $key ; } //对值进行排序 for ( $i =0; $i < $count ; $i ++) { for ( $j = $count -1; $j > $i ; $j --) { //<从小到大排列 升降在这修改 $bol = $strOrder == 'asc' ? $arrVal [ $j ]< $arrVal [ $j -1] : $arrVal [ $j ]> $arrVal [ $j -1]; if ( $bol ){ $tmp = $arrVal [ $j ]; $arrVal [ $j ] = $arrVal [ $j -1]; $arrVal [ $j -1] = $tmp ; //值的冒泡排序,引起key的数组的交互 $keytmp = $arrKeyMap [ $j ]; $arrKeyMap [ $j ] = $arrKeyMap [ $j -1]; $arrKeyMap [ $j -1] = $keytmp ; } } } if ( count ( $arrKeyMap )) { foreach ( $arrKeyMap as $val ) { $arrReturn [] = $arrKey [ $val ]; } } return $arrReturn ; } } /** * 使用原生的函数进行数组按照值进行排列 */ function arraySortByVal( $arr , $keys , $type = 'asc' ){ $keysvalue = $new_array = array (); foreach ( $arr as $k => $v ){ $keysvalue [ $k ] = $v [ $keys ]; } if ( $type == 'asc' ){ asort( $keysvalue ); } else { arsort( $keysvalue ); } reset( $keysvalue ); foreach ( $keysvalue as $k => $v ){ $new_array [ $k ] = $arr [ $k ]; } return $new_array ; } ?> |