快速排序算法的原理如下:
1、首先设定一个分界值,通过该分界值将数组分成左右两部分。
2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
3、然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
4、重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
快速排序算法流程图:
快速排序时间复杂度:
快速排序代码实现:
/**
* 快速排序
*
* @param array $arr
*
* @return array
*/
function quickSort(array $arr):array
{
if (count($arr) == 0) {
return $arr;
}
$middle = $arr[0];
$left = [];
$right = [];
for ($i = 1; $i < count($arr); $i++) {
$arr[$i] < $middle ? array_push($left, $arr[$i]) : array_push($right, $arr[$i]);
}
$left = quickSort($left);
$right = quickSort($right);
return array_merge($left, [$middle], $right);
}
//$arr = array(8,3,2,6,7,1,5,4);
//print_r(quickSort($arr));
快速排序代码实现(二维数组版):
/**
* 快速排序(二维数组版)
*
* @param array $arr
* @param string $key
* @param string asc|desc
*
* @return array
*/
function quickSort($arr, $key, $sort='asc'){
if(count($arr) == 0){
return $arr;
}
$middle = $arr[0][$key];
$left = [];
$right = [];
for($i=1; $i<count($arr); $i++){
($sort == 'asc' ? $arr[$i][$key] < $middle : $arr[$i][$key] > $middle) ?
array_push($left, $arr[$i]) : array_push($right, $arr[$i]);
}
$left = quickSort($left, $key);
$right = quickSort($right, $key);
return array_merge($left, [$arr[0]], $right);
}
Example:
$data = [];
$data[] = array("item"=>"item 4", "id"=>4);
$data[] = array("item"=>"item 1", "id"=>1);
$data[] = array("item"=>"item 3", "id"=>3);
$data[] = array("item"=>"item 2", "id"=>2);
$data = quickSort($data, 'id', 'asc');
print_r($data);
output:
Array
(
[0] => Array
(
[item] => item 1
[id] => 1
)
[1] => Array
(
[item] => item 2
[id] => 2
)
[2] => Array
(
[item] => item 3
[id] => 3
)
[3] => Array
(
[item] => item 4
[id] => 4
)
)