public function bubbleSort($s = [])
{
if(!$s) return false;
$len = count($s);
for($i = 0; $i<$len; $i++)
{
for($j = $i+1; $j<$len; $j++)
{
if($s[$i] > $s[$j])
{
//exchange sort array element
$tmp = $s[$i];
$s[$i] = $s[$j];
$s[$j] = $tmp;
}
//dp($s);
}
}
return $s;
}
//快速排序
public function quickSort($a = [])
{
if(count($a) <= 1) return $a;
$key = $a[0];//key 可以任意取
$left = []; $right = [];
for($i = 1; $i<count($a); $i++)
{
if($a[$i] <= $key)
{
$left[] = $a[$i];
}
else
{
$right[] = $a[$i];
}
}
$left = $this->quickSort($left);
$right = $this->quickSort($right);
return array_merge($left, [$key], $right);
}
//插入排序:每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。
public function insertSort($a = [])
{
if(count($a) == 0) return false;
$len = count($a);
for($i = 1; $i<$len; $i++)
{
if(isset($a[$i]))
{
$tmp = $a[$i];//保存后边的这个元素,插入的时候有指针的移动
$j = $i - 1; //和前面的一个元素进行比较
while($a[$j] > $tmp)
{
$a[$j+1] = $a[$j];
$a[$j] = $tmp;
$j--;
if($j<0) break;
}
}
//dp($a);//detail
}
return $a;
}
//选择排序:每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
public function selectSort($a = [])
{
$len = count($a);
if($len == 0) return false;
for($i = 0; $i < $len; $i++)
{
$min = $i;
for($j = $i+1; $j<$len; $j++)
{
if($a[$min]>$a[$j])
{
$min = $j;
if($min != $i)
{
$tmp = $a[$i];
$a[$i] = $a[$j];
$a[$j] = $tmp;
}
}
}
//dp($a);
}
return $a;
}
/**
* 希尔排序
* 希尔排序的实质是分组插入排序,该方法又称缩小增量排序。该方法的基本思想是:先将整个待排元素序列分割为若干个子序列(由相隔某个‘增量’的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,带这个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况)效率是很高的,因此希尔排序在时间效率上有较大的提高。
*
*
*
*/
public function shellSort($a = [])
{
$increment = $len = count($a);
if($increment<=0) return false;
do{
$increment = ceil($increment/3);//拆分数组
//dp($increment);
for($i = $increment; $i < $len; $i++)
{
//插入排序
if($a[$i] < $a[$i - $increment])
{
$tmp = $a[$i];
for($j = $i - $increment; $j >= 0 && $tmp < $a[$j]; $j -= $increment)
{
$a[$j+$increment] = $a[$j]; //? $j
}
$a[$j+$increment] = $tmp;
}
}
}while($increment > 1);
return $a;
}
/**
* 二分插入排序, 类似选择排序。
*
* 从第一个元素开始,该元素可以认为已经被排序;
取出下一个元素,在已经排序的元素序列中二分查找到第一个比它大的数的位置;
将新元素插入到该位置后;
重复上述两步
*
*/
public function binarySort($a = [])
{
$len = count($a);
if($len<=0) return false;
for($i=1; $i < $len; $i ++)
{
$key = $a[$i]; $left = 0; $right = $i -1;
while($left <= $right)
{
$middle = ceil(($left+$right)/2);//二分点
if($key < $a[$middle])
{
$right = $middle -1;
}
else
{
$left = $middle + 1;
}
}
for($j = $i -1; $j >= $left; $j --)
{
$a[$j + 1] = $a[$j];
}
$a[$left] = $key;
}
return $a;
}