php 常问的几个排序

参考地址:https://www.imooc.com/article/265215

https://blog.csdn.net/qq_17677907/article/details/88294827

//插入排序
<?php
//原地排序 时间复杂度O(n2)
$array = [34,5,5,4,14,5,89,88,54];
$num = count($array);

//与已经排过的数组进行比较
for($i = 1 ; $i < $num ; $i++)
{
    $temp = $array[$i];
    for($j = $i-1; $j >= 0 ; $j--)
    {
        if($array[$j] >= $temp)
        {
            $array[$j+1] = $array[$j];
            $array[$j] = $temp; 
        }
    }
}

//冒泡是交换算法
// for($i = 0; $i < $num; $i++)
// {
//     for($j=$i+1; $j < $num ; $j++)
//     {
//         $temp = $array[$i];
//         if($array[$i] > $array[$j])
//         {
//             $array[$i] = $array[$j];
//             $array[$j] = $temp;
//         }
//     }
// }

echo '<pre>';
print_r($array);
?>
<?php
    class sort
    {
        //快速排序--原地排序
        public function quickSort($array)
        {
            //
            $num = count($array);
            if($num <= 1)
            {
                return $array;
            } 

            $middle = $array[0];
            $left = $right = [];
            for($i = 1; $i < $num ;$i++)
            {
                if($middle < $array[$i])
                {
                    $right[] = $array[$i];
                }
                else
                {
                    $left[] = $array[$i];
                }
            }
            $left = $this->quickSort($left);
            $right = $this->quickSort($right);
            return array_merge($left,array($middle),$right);
        }

    
}
    //插入排序
    $array = [4,5,7,6,3,2];
    // $insert_array = [1,2,3,4,5,6];
    $sort = new sort();
    $rs = $sort->quickSort($array);


    echo '<Pre>';
    print_r($rs);


?>
<?php
//归并排序
//思路对数据进行1/2的拆,拆到最后只剩2个,再有序合并

function array_split($array)
{
    if(count($array) <= 1)
    {
        return $array;
    }

    $mid = intval(count($array) / 2);
    $left_array = array_slice($array,0,$mid);
    $right_array = array_slice($array,$mid);

    $left_array = array_split($left_array);
    $right_array = array_split($right_array);

    //合并
    $all_array = _merge($left_array,$right_array);
    return $all_array;
}

function _merge($arr1, $arr2)
{
    $return = [];
    while(count($arr1) > 0 && count($arr2) > 0)
    {
        $return[] = $arr1[0] < $arr2[0] ? array_shift($arr1) : array_shift($arr2);
    }

    return array_merge($return,$arr1,$arr2);
}


$arr = [9,17,7,10,103,27,387,28,910,1,509,22,768];

$a = array_split($arr);
echo '<pre>';
print_r($a);
?>
//只是实现了先按value排,value相同按key排,但效率太低了
<?php

$arr = ["zhangch"=>9,"mengna"=>7,"lichu"=>7,"zhouji"=>8,"zhengie"=>8,"lie"=>8,"wanan"=>6];
$values = array_values($arr);
$after = quickSort($values);
$new_array = [];
$new_keys = [];
foreach($after as $key=>$val)
{
    $_key = array_search($val,$arr);
    if($_key)
    {
        $new_array[$_key] = $val;
        $new_keys[$val][] = $_key;
        unset($arr[$_key]);
    }
}


$sort_key = sortKey($new_keys);

$new_bee = [];

foreach($sort_key as $ck=>$cval)
{
    if(count($cval) > 1)
    {
        foreach($cval as $_ck=>$_cv)
        {
            $new_bee[$_cv] = $new_array[$_cv];
        }
    }
    else
    {
        $new_bee[$cval[0]] = $new_array[$cval[0]];
    }

}


//相同key比对
function sortKey($val)
{
    // echo '<Pre>';
    // var_dump($val);exit;
    foreach($val as $ck=>&$cval)
    {
        $num = count($cval);
        if($num > 1)
        {

           for($i = 0 ;$i < $num ; $i++)
           {
                for($j = $i+1; $j < $num ; $j++)
                {
                    if(strcmp($cval[$i], $cval[$j]) > 0)
                    {
                        $temp = $cval[$i];
                        $cval[$i] = $cval[$j];
                        $cval[$j] = $temp;
                    }
                }
           }    
        } 
      
    }

    return $val;
}

//value比对
function quickSort($val)
{
    $num = count($val);
    if($num <=1)
    {
        return $val;
    }

    $first = $val[0];
    $left = [];
    $right = [];
    for($i = 1; $i< $num ; $i++)
    {
        if($val[$i] <= $first)
        {
            $left[] = $val[$i];
        }
        else
        {
            $right[] = $val[$i];
        }
    }
    $left = quickSort($left);
    $right = quickSort($right);
    return array_merge($left,[$first],$right);
}

echo ' <Pre>';
print_r($new_bee);
?>
//先序、中序、后序
<?php
class Node{
	public $value;
	public $left;
	public $right;
}
//先序遍历 根节点 ---> 左子树 ---> 右子树
function preorder($root){
	$stack=array();
	array_push($stack,$root);
	while(!empty($stack)){
		$center_node=array_pop($stack);
		echo $center_node->value.' ';//先输出根节点
		if($center_node->right!=null){
			array_push($stack,$center_node->right);//压入左子树
		}
		if($center_node->left!=null){
			array_push($stack,$center_node->left);
		}
	}
}
//中序遍历,左子树---> 根节点 ---> 右子树
function inorder($root){
    $stack = array();
    $center_node = $root;
    while (!empty($stack) || $center_node != null) {
             while ($center_node != null) {
                 array_push($stack, $center_node);
                 $center_node = $center_node->left;
             }
 
             $center_node = array_pop($stack);
             echo $center_node->value . " ";
 
             $center_node = $center_node->right;
         }
}
//后序遍历,左子树 ---> 右子树 ---> 根节点
function tailorder($root){
	$stack=array();
	$outstack=array();
	array_push($stack,$root);
	while(!empty($stack)){
		$center_node=array_pop($stack);
		array_push($outstack,$center_node);//最先压入根节点,最后输出
		if($center_node->left!=null){
			array_push($stack,$center_node->left);
		}
		if($center_node->right!=null){
			array_push($stack,$center_node->right);
		}
	}
	
	while(!empty($outstack)){
		$center_node=array_pop($outstack);
		echo $center_node->value.' ';
	}
	
}
$a=new Node();
$b=new Node();
$c=new Node();
$d=new Node();
$e=new Node();
$f=new Node();
$a->value='A';
$b->value='B';
$c->value='C';
$d->value='D';
$e->value='E';
$f->value='F';
$a->left=$b;
$a->right=$c;
$b->left=$d;
$c->left=$e;
$c->right=$f;
preorder($a);//A B D C E F 
echo '<hr/>';
inorder($a);//D B A E C F
echo '<hr/>';
tailorder($a);//D B E F C A

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值