一、 快速排序
快速排序使用分治法策略来把一个串行分为两个子串行,平均时间复杂度Ο(n log n)。
算法步骤:
1 从数列中挑出一个元素,称为 “基准”;
2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作;
3 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归实现(PHP):
function quick_sort(&$arr, $start, $end){
$temp = $arr[$start];
$start_index = $start;
$end_index = $end;
while($start_index < $end_index){
while($arr[$end_index] >= $temp && $start_index < $end_index){
$end_index --;
}
if ($start_index < $end_index){
$arr[$start_index] = $arr[$end_index];
$start_index ++;
}
while($arr[$start_index] <=$temp && $start_index < $end_index){
$start_index++;
}
if ($start_index < $end_index){
$arr[$end_index] = $arr[$start_index];
$end_index--;
}
}
$arr[$start_index] = $temp;
if ($start < $start_index - 1){
quick_sort($arr, $start, $start_index - 1);
}
if ($end_index + 1 < $end){
quick_sort($arr,$end_index + 1, $end);
}
}
非递归实现:
function quick_sort(&$arr){
$stack = array();
array_push($stack, 0);
array_push($stack, count($arr)-1);
while(!empty($stack)){
$end = array_pop($stack);
$start = array_pop($stack);
$start_index = $start;
$end_index = $end;
while($start_index < $end_index){
while($arr[$end_index] >= $temp && $start_index < $end_index){
$end_index --;
}
if ($start_index < $end_index){
$arr[$start_index] = $arr[$end_index];
$start_index ++;
}
while($arr[$start_index] <= $temp && $start_index < $end_index){
$start_index++;
}
if ($start_index < $end_index){
$arr[$end_index] = $arr[$start_index];
$end_index--;
}
}
$arr[$start_index] = $temp;
if ($start < $start_index - 1){
array_push($stack, $start);
array_push($stack,$start_index - 1);
}
if ($end_index + 1 < $end){
array_push($stack,$end_index + 1);
array_push($stack,$end);
}
}
}