class Sort
{
public $array = [1, 22, 21, 23, 4, 5, 25, 6];
/**
* 快排算法
* @param array $arr
* @return int[]
*/
public function quickSort($arr = []): array
{
//1.从数组中挑出一个数作为基准元素,通常第一个或者最后一个元素;
//2.扫描数组,以基准元素为比较对象,把数组分成两个区,小的移动到基准元素前面,大的移到后面,相等的前后都可以,基准元素处于数组的中间部分;
//3.然后再用同样的方法,递归的排序划分两部分
$len = count($arr);
if ($len <= 1) { //设定结束条件
return $arr;
}
//选择第一个元素作为基准元素
$pivot = $arr[0];
$left = $right = []; //初始化左右数组
for ($i = 1; $i < $len; $i++) { //遍历整个数组
if ($arr[$i] < $pivot) { //假设循环中每个$i的值小于基准元素
$left[] = $arr[$i]; //放置在左数组
} else {
$right[] = $arr[$i]; //大于放置右数组
}
}
//再用同样的方法,递归的排序划分两部分
$left = $this->quickSort($left);
$right = $this->quickSort($right);
//合并基准元素,和左右数组
return array_merge($left, array($pivot), $right);
}
/**
* 冒泡排序
*/
public function bubbleSort(): array
{
//从第一个元素,比较相邻的元素,如果第一个比第二个大,就交换位置;一直持续交换,直到交换次数越来越少,排序结束;
$len = count($this->array);
for ($i = 1; $i < $len; $i++) { //遍历所有数组的值
for ($k = 0; $k < $len - $i; $k++) { //比较循环轮数
if ($this->array[$k] > $this->array[$k + 1]) { //假设每轮第$k元素大于$k后面的元素,交互位置
$temp = $this->array[$k + 1];
$this->array[$k + 1] = $this->array[$k];
$this->array[$k] = $temp;
}
}
}
return $this->array;
}
/**
* 选择排序
* @param array $arr
* @return array
*/
public function selectSort(&$arr = []): array
{
//在排序的一组数中,选出最小的一个数与第一个位置交换,直到在剩下的数当中在找最小的与第二个位置交换
//如此循环到倒数第二个数和最后一个数比较为止。
$len = count($this->array);
for ($i = 0; $i < $len - 1; $i++) {
$p = $i; //假设最小的值得位置
for ($j = $i + 1; $j < $len; $j++) {
if ($arr[$p] > $arr[$j]) {
$p = $j; //比较下更小的,记录最小值的位置
}
}
if ($p != $i) { //确定当前最小位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
$temp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $temp;
}
}
return $arr;
}
}
$rs = new Sort();
//快排算法
$arr = [1, 22, 21, 23, 4, 5, 25, 6];
//print_r($rs->quickSort($arr));
//冒泡排序
//print_r($rs->bubbleSort());
//选择排序
//print_r($rs->selectSort($arr));