<?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 ;
}
|