插入排序原理:给定一个无序数组a,假设元素a[0]-a[i-1]有序,则从a[i]开始和数组a[0]-a[i-1]之间的元素进行比较,将a[i]插入到合适的位置,从而保证a[0]-a[i]有序,以此类推,将整个数组排序。插入排序算法的最大时间复杂度是O(n^2),插入排序适合基本有序的数组结构,它的最小的时间复杂度接近O(n),那么为了尽量减少插入排序的时间复杂度,因此引入了希尔排序,希尔排序是插入排序的优化方案,它引入一个增量的概念,使数组按照增量增长有序,依次减少增量到1,使整个数组有序,以此来减少时间复杂度,希尔排序的时间复杂度是O(nlogn),并且插希尔排序不是稳定的排序算法.
插入排序
function insertSort(array &$a)
{
$length = count($a);
for($i == 1; $i < $length; ++$i) {
if($a[$i] < $a[$i-1]) {
$tmp = $a[$i];
for($j = $i; $j > 0; --$j) {
if($a[$j-1] > $tmp){
$a[$j] = $a[$j-1];
} else {
break;
}
}
$a[$j] = $tmp;
}
}
}
希尔排序
function shellSort(array &$a, $incre)
{
$length = count($a);
while(true) {
for($i = $incre; $i < $length; ++$i) {
if($a[$i] < $a[$i-$incre]) {
$tmp = $a[$i];
for($j = $i -$incre; $j > 0; $j -= $incre) {
if(isset($a[$j]) && $a[$j] > $tmp) {
$a[$j+$incre] = $a[$j];
} else {
break;
}
}
$a[$j+$incre] = $tmp;
}
}
$incre = intval($incre/2);
if($incre < 1) {
break;
}
}
}
$a = [0,20,7,-1,6,2,6,2,8,9,0,1];
shellSort($a, 3);
运行结果:0,-1,0,1,2,2,6,6,7,8,9,20
快排:
function qSort(array &$a, $low, $high)
{
if($low >= $high) {
return;
}
$index = partition($a,$low,$high);
qSort($a,$low,$index-1);
qSort($a,$index+1,$high);
}
//元素相互赋值比交换效率
function partition(array &$a, $low, $high)
{
$temp = $a[$low];
while($low < $high) {
while($low < $high && $a[$high] >= $temp) {
--$high;
}
$a[$low] = $a[$high];
while($low < $high && $a[$low] <= $temp) {
++$low;
}
$a[$high] = $a[$low];
}
$a[$low] = $temp;
return $low;
}
$a = [0,20,7,-1,6,2,6,2,8,9,0,1];
qSort($a, 0, count($a) -1);
var_dump(implode(',', $a));
结果展示:-1,0,0,1,2,2,6,6,7,8,9,20