python php 快速排序

#!/usr/bin/python
#coding=UTF-8
def partition(li,left,rigth):
	temp = li[left] #获取第一个值假定为列表的中间值
	while left < rigth: # 如果中间值的左边小于右边 则说明比较的值左边为空 则将值复还结束算法
		while left < rigth and temp <= li[rigth]: #从列表结尾开始循环比较右边的值
			rigth -= 1 #依次向左进一步 
		li[left] = li[rigth] #将找到的值直接写到列表最开始(左边) 因为temp <= li[rigth] 所以会出现 两个值相当的情况
		while left < rigth and temp >= li[left]:#从列表开头开始循环比较左边的值
			left +=1 #依次向右进一步 
		li[rigth]=li[left] #将找到的值直接写到列表最开始(右边) 因为temp >= li[left] 所以会出现 两个值相当的情况
	li[left] = temp
	return left

def quick_sort(li,left,rigth):#快速排序利用将列表分为左右两边的方式,分别进行递归比较排序
	if left < rigth:
		mid = partition(li,left,rigth) #获取中间的值
		quick_sort(li,left,mid-1) #循环调用 开始递归左边
		quick_sort(li,mid+1,rigth) #循环调用 开始递归右边


# 时间复杂度 最优情况为O(nlogn) 最坏情况为O(n^2) 如果第一次取得的值正好是最大或者最小的 那么会出现O(n^2) 解决办法是可以使用随机取第一个值的方法进行改进,不过只是将最坏情况的概率减小了,并不能解决此问题 

li = [5,7,4,6,3,1,2,9,8];
if __name__ == "__main__":
	quick_sort(li,0,len(li)-1)
	print li
	
________________________________

# php快速排序 因为python操作的是数组的地址 而PHP在传值的时候是把当前的值复制一份,因为递归是无法直接返回的,只能操作地址,所以这里需要传入数组地址
________________________________
//快速排序
function partition(&$li,$left,$right)
{
	$temp = $li[$left];

	while ( $left < $right) {
		//echo $right;echo "<br />";
		while ($left < $right &&  $li[$right] >= $temp) {
			//echo $right;echo "<br />";
			$right -=1;
		}
		$li[$left] = $li[$right];
		//var_dump($li);echo "<br />";
		//echo  $li[$left];exit;
		while ($left < $right && $li[$left] <= $temp) {
			$left +=1;
		}
		$li[$right] = $li[$left];
		//var_dump($li);echo "<br />";
		
	}
	$li[$left] = $temp;
	return $left;
	//$mid = round(count($li)/2);
	//return  $temp;
}
function quick_sort(&$li,$left,$right)
{
	if ($left < $right) {
		$mid = partition($li,$left,$right);
		//var_dump($mid);echo "<br />";
		quick_sort($li,$mid+1,$right);
		quick_sort($li,$left,$mid-1);
		//var_dump($li);echo "<br />";
	}

}
$li = [5,7,4,6,3,1,2,9,8];
$right = count($li)-1;
quick_sort($li,0,$right);
var_dump($li);

原文地址:https://www.cnblogs.com/ikai/p/11604220.html