快排算法
快速排序是系统中常用的排序方法,也是面试常考题目,快排的本质是利用空间解决时间问题,通过并发运算,解决运算耗时问题。快速排序本身需要比较的次数比冒泡会多,但是其递归的良好应用,使得排序效率极高。
具体做法(这里的做法是主要针对我自己的代码,与百度算法有一些区别):
- 从数组中取出关键数据,一般都是取第一个数据
- 将数组中的数据与关键数据进行对比,如果比关键数据大,则放入关键数组左侧,反之放在右侧
- 将左右两侧的数据再次进行第1、2步操作,直到所有数据排序完成
代码实现
//这是百度的排序示例,这里是直接对原数组进行排序,循环较多,而且不直观。我自己改变了一下,让他更容易理解
function qs($a, $s=0, $e=null) {
if($e === null) {
$e = count($a);
}
if($s >= $e) {
return $a;
}
$j = $e-1;
$i = $s;
$n = $a[$s];
//$ac = $a;
for(; $j>$i; $j--) {
if($a[$j] < $n) {
$t = $a[$i];
$a[$i] = $a[$j];
$a[$j] = $t;
for($i++;$i<$j;$i++) {
if($a[$i] > $n) {
$t = $a[$j];
$a[$j] = $a[$i];
$a[$i] = $t;
break;
}
}
}
}
//printf("\n[%s], %s ~ %s [%s] %s-%s-%s", implode($ac, ','), $s, $e, implode($a, ','), $i, $j, $e);
qs(&$a, $s, $i);
qs(&$a, $i+1, $e);
return $a;
}
//这是我的算法,下面的比较可以再简化
function quickSort($array = array())
{
global $time;
if(count($array) <= 1) {
return $array;
}
$temp = $array[0];
$array_left = $array_right = $array_current = array();
foreach ($array as $item) {
$time++;
if ( $item < $temp) {
$array_left[] = $item;
}
if ( $item > $temp) {
$array_right[] = $item;
}
if ( $item == $temp) {
$array_current[] = $item;
}
}
$array_right = quickSort($array_right);
$array_left = quickSort($array_left);
return array_merge($array_left,$array_current,$array_right);
}