归并排序算法实现(PHP语言)

归并排序算法实现(PHP语言)

//归并排序算法(php)
//author:Hengda
//$arr 待排序数组
//$start $len 每段待排序数据的起始位置和长度
//$mode false 正序,true倒序
function mergeSort( $arr, $start, $len, $mode ){
     

	//左右分开排序
	if( $len > 4 ){
     

		$lstart = $start;//左侧部分起始位置
		$llen = floor( $len / 2 );//左侧部分长度
		$rstart = $lstart + $llen;//右侧部分起始位置
		$rlen = $len - $llen;//右侧部分长度

		$arr = mergeSort( $arr, 0, $lstart, $llen, $mode );
		$arr = mergeSort( $arr, 0, $rstart, $rlen, $mode );
	}

	//依次向后遍历每个元素,然后依次将此元素与后续元素作对比,比其大或者小的值向后移动,最后将当前元素填入空缺中
	for( $i = $start + 1; $i < $start + $len; $i++ ){
     

		$temp = $arr[ $i ];
		//依次向前比较并向后移动比其大或者小的
		for( $j = $i-1; $j >=$start && ( $mode ? $arr[ $j ] < $temp : $arr[ $j ] > $temp ); $j-- ){
     
			//向后移动
			$arr[ $j + 1 ] = $arr[ $j ];
		}
		//填充空缺
		$arr[ $j + 1 ] = $temp;
	}
	return $arr;
}

测试排序

//生成$n个随机数组成的数组
//author:Hengda
//$n随机数个数
function makeData( $n ){
     
	$arr = Array();
	while( $n-- ){
     
		$arr[] = mt_rand( 0, $n );
	}
	return $arr;
}

//测试
//生成测试数据
$arr = makeData( 1000 );
echo "排序".count( $arr )."个数:";
//打印原始数据
echo "原始数据:".implode( ',', $arr )."
"
; //排序 echo "
正序排序:
"
; $stime = microtime(true); $arr1 = mergeSort( $arr, 0, count( $arr ) , false ); $etime = microtime(true); echo "排序耗时:".( $etime - $stime )." 秒"."
"
; //打印 echo "排序结果:".implode( ',', $arr1 )."
"
; //排序 echo "
倒序排序:
"
; $stime = microtime(true); $arr1 = mergeSort( $arr, 0, count( $arr ), true ); $etime = microtime(true); echo "排序耗时:".( $etime - $stime )." 秒"."
"
; //打印 echo "排序结果:".implode( ',', $arr1 )."
"
;

排序结果

归并排序算法实现(PHP语言)_第1张图片

你可能感兴趣的:(PHP,排序算法,排序算法,php,算法,归并排序)