排序算法(快排&归并&选择&插入&冒泡)php&go实现

编程

//排序常用算法

//排序算法 稳定排序算法

class SortAlg

{

//冒泡排序

public function maoPaoSort($arr)

{

$n = count($arr);

if ($n <= 1) {

return $arr;

}

for ($i=0; $i < $n; $i++) {

//退出循环比较标识符

$flg = false;

for ($j = 0; $j < $n - 1; $j++) {

//冒泡是一种稳定排序 遇到相等的值时 不用交换位置 直接退出比较循环

if ($arr[$j] > $arr[$j + 1]) { //数据交换

$tmp = $arr[$j + 1];

$arr[$j+1] = $arr[$j];

$arr[$j] = $tmp;

$flg = true; //有数据交换

}

}

//没有数据交换

if (!$flg) {

break;

}

}

return $arr;

}

//插入排序 稳定排序算法

//是在排好序的数据中做值的对比和移动

public function insertSort($arr)

{

$n = count($arr);

if ($n <= 1) {

return $arr;

}

for ($i = 1; $i < $n; $i++) {

$val = $arr[$i]; //第二个位置

for ($j= $i - 1; $j >= 0; $j--) {

//依次比较前面数据每一个数据是否大于当前$arr[$i],如果大于

//则 往后位置移动, $j最后为要插入数据的位置

if ($arr[$j] > $val) {

$arr[$j + 1] = $arr[$j];

} else {

break;

}

}

//最后要插入位置插入当前值 $j为-1时 位置为第一个(0)

$arr[$j + 1] = $val;

}

return $arr;

}

//选择排序 非稳定排序算法

//是在未排序的数据中做比较 找到最小值的位置 然后交换最小值与当前值

public function selectSort($arr)

{

$n = count($arr);

if ($n <= 1) {

return $arr;

}

$tmp = 0;

for ($i = 0; $i < $n - 1; $i++) {

$min = $i; //最小数位置

for ($j = $i + 1; $j < $n; $j++) {

if ($arr[$j] < $arr[$min]) {

$min = $j;

}

}

//交换 最小值与当前值交换

if ($min != $j) {

$tmp = $arr[$i];

$arr[$i] = $arr[$min];

$arr[$min] = $tmp;

}

}

return $arr;

}

//归并排序 稳定排序 分而治之

public function mergeSort($arr)

{

$n = count($arr);

if ($n <= 1) {

//递归结束条件

return $arr;

}

$mid = intval($n / 2);

$l = array_slice($arr, 0, $mid);

$r = array_slice($arr, $mid);

$left = $this->mergeSort($l); //左边数据拆分

$right = $this->mergeSort($r); //右边数据拆分

$ret = $this->Merge($left, $right);

return $ret;

}

//合并

private function Merge($left, $right)

{

$arr = [];

$i = 0;

while (count($left) && count($right)) {

//此处相当于正在移动左右指针

if ($left[$i] < $right[$i]) {

$arr[] = array_shift($left);

} else {

$arr[] = array_shift($right);

}

}

return array_merge($arr, $left, $right);

}

//快速排序 但是这种不是原地排序 $left和$right需要额外申请空间

public function quickSort1($arr)

{

$n = count($arr);

if ($n <= 1) {

//递归结束条件

return $arr;

}

$left = [];

$right = [];

$mid = array_pop($arr);

foreach ($arr as $k => $v) {

if ($arr[$k] < $mid) {

$left[] = $v;

} else {

$right[] = $v;

}

}

$l = $this->quickSort1($left);

$r = $this->quickSort1($right);

return array_merge($l, [$mid], $r);

}

//快速排序 原地排序 移动指针排序 不用申请其他空间

public function quickSort2()

{

}

}

$arr = [7, 5, 6, 3, 8, 2, 4];

$sort = new SortAlg;

//冒泡排序

// var_dump($sort->maoPaoSort($arr));exit;

//插入排序

// var_dump($sort->insertSort($arr));

//选择排序

// var_dump($sort->selectSort($arr));

//归并排序

// var_dump($sort->mergeSort($arr));

//快速排序

var_dump($sort->quickSort1($arr));

GO

以上是 排序算法(快排&amp;归并&amp;选择&amp;插入&amp;冒泡)php&amp;go实现 的全部内容, 来源链接: utcz.com/z/515019.html

回到顶部