快排算法通过多次比较和交换来实现排序
快排算法的原理如下:
1,首先设定一个分界值,通过该分界值将数组分成左右两部分。
2,将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
3,然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
4,重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了
<?php
$arr = [];
$num = 1000;
for($i = 0;$i < $num;$i++){
$arr[] = mt_rand(100,999);
}
// 开始的时钟时间(秒)
$start_time = microtime(true);
/**
* 快排
*
* @param [type] $array
* @return void
*/
function quick_sort($array){
if(count($array) <= 1) return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for($i = 1; $i < count($array); $i++){
if($array[$i] <= $key){
$left_arr[] = $array[$i];
}else{
$right_arr[] = $array[$i];
}
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr,array($key),$right_arr);
}
$endTime = microtime(true);
$timeConsum = round(($endTime - $start_time),3) * 1000;
echo '使用了 '.$timeConsum.'毫秒';