>  기사  >  php教程  >  PHP快速排序算法(非递归)实现

PHP快速排序算法(非递归)实现

PHP中文网
PHP中文网원래의
2016-05-23 16:41:022315검색

php代码

<?php

$i = 100;
while($i > 0){
	if($i > 30){
		$test[] = mt_rand($i - 30, $i--);
	}else{
		$test[] = mt_rand(1, $i--);
	}
}
//shuffle($test);
echo count($test), "\n";

//sort($test);
echo implode(", ", $test), "\n\n";
$t1 = microtime(true);

quicksort($test);
echo implode(", ", $test), "\n\n";
echo microtime(true) - $t1, "<br>\n";



function quicksort(array &$sort){
	$end = count($sort);
	if(--$end < 1){
		return;
	}

	$beg = 0;
	$stack = array();

	while(true){
		$i = $beg;
		$l = $end;
		$o = $sort[
			$x = mt_rand($i, $l)
		];

		while($i < $l){
			// 左边大于的
			if($sort[$i] > $o){
				while($i < $l){
					// 右边小于等于的
					if($sort[$l] <= $o){
						$tmp = $sort[$i];
						$sort[$i] = $sort[$l];
						$sort[$l] = $tmp;
						$i++; $l--;
						continue 2;
					}
					$l--;
				}
				goto re;
			}
			$i++;
		}
		if($sort[$i] < $o){
			$sort[$x] = $sort[$i];
			$sort[$i] = $o;
		}
//		echo $i, ", ", $l, "; ", $beg, ", ", $end, "\n";

	re:
		// 保存右边
		if($i < $end){
			$stack[] = $i;
			$stack[] = $end;
		}
		if(--$i > $beg){
			$end = $i; // 继续左边
		}elseif($stack){
			// 返回继续右边
			$end = array_pop($stack);
			$beg = array_pop($stack);
		}else{
			break;
		}
	}
}
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.