#!/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);