您的位置:首页 > 其它

算法入门之快速排序

2014-05-11 23:23 274 查看
快速排序原理:

快速排序先把等待排序的集合打乱顺序,把第一个元素作为基准元素,为第二个元素和最后一个元素分配两个指针i和j,如果a[i]小于基准元素则i++,如果a[j]大于基准元素则j--,这样把大于基准元素的a[i]和小于基准元素的a[j]互换,以此类推,最终把基准元素与a[j]相交换,就得到一个a[j]左侧全部小于a[j],右侧全部大于a[j]的一个近似有序数组,然后按照如上步骤重新寻找每个被a[j]分开的数组中的分隔点,最终得到有序数组。

在通用排序中,一般都会选取快速排序来解决问题。

具体实现算法如下;

<?php
function less($m, $n) {
return $m < $n;
}

function exch(&$a, $i, $j) {
$tmp = $a[$i];
$a[$i] = $a[$j];
$a[$j] = $tmp;
}

function partition(&$a, $lo, $hi) {
$i = $lo;
$j = $hi+1;
while(true) {
while(less($a[++$i], $a[$lo])) if($i == $hi) break;
while(less($a[$lo], $a[--$j])) if($j == $lo) break;
if($i >= $j) break;
exch($a, $i, $j);
}
exch($a, $lo, $j);
return $j;
}

function fastSort(&$a, $lo, $hi) {
if($lo >= $hi) return;
$j = partition($a, $lo, $hi);
fastSort($a, $lo, $j-1);
fastSort($a, $j+1, $hi);
}

$a = array(6, 4, 3, 9, 5, 2, 0, 8, 1, 7);
shuffle($a);
print_r($a);
fastSort($a, 0, 9);
print_r($a);排序结果:
array(0,1,2,3,4,5,6,7,8,9);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息