php --- 基础排序算法

 

 

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;
}


posted @ 2017-04-24 10:50  修行中的忍者  阅读(107)  评论(0)    收藏  举报