快速排序原理:
快速排序先把等待排序的集合打乱顺序,把第一个元素作为基准元素,为第二个元素和最后一个元素分配两个指针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);
算法入门之快速排序
时间: 2024-09-30 20:09:24