快速排序
思路:
- 我们首先要找到一个基准,数组的前半部分是比基准小的元素,数组后半部分是比基准大的元素,这里我就拿数组第一个元素作为基准;
- 设置队首和队尾两个指针;
- 队尾指针先进行活动,一直向队首移动,直到找到比基准值小的元素,然后将这个值赋给队首指针处;
- 下面队首指针开始活动,一直向队尾移动,直到找到比基准值大的元素,然后将这值赋给队尾指针处;
- 等到队首指针和队尾指针指向同一处时,将基准值赋给当前指针指向的同一位置,此时,基准元素前面的都是比它要小的元素,后面都是比它大的元素;
- 接下来,就是采用上述步骤将两边的部分分别进行排序,如此循环下去,直至开始的low>=开始的high,说明就剩下了一个元素,也就无需再排了。
/**
* @param $arr
* @param $low
* @param $high
* @return mixed
*/
function quickSort(&$arr,$low,$high){
if($low < $high){
$index = getIndex($arr,$low,$high);
quickSort($arr,0,$index-1);
quickSort($arr,$index+1,$high);
}
return $arr;
}
/**
* @param $arr
* @param $low
* @param $high
* @return mixed
*/
function getIndex(&$arr,$low,$high){
$tmp = $arr[$low];
while($low < $high){
//如果队尾元素值大于基准元素,那么high--
while($low < $high && $arr[$high] > $tmp){
$high--;
}
//如果队尾元素小于基准值,那么就将队尾元素赋值给队首元素
$arr[$low] = $arr[$high];
//如果队首元素小于基准值,那么low++
while($low < $high && $arr[$low] < $tmp){
$low++;
}
//如果队首元素大于基准值,就将队首元素赋值给队尾元素
$arr[$high] = $arr[$low];
}
//退出时,high == low
$arr[$low] = $tmp;
return $low;
}
$arr = array(4,5,1,6,2,8,3,11,10);
print_r(quickSort($arr,0,count($arr)-1));