排序算法:七大排序算法的PHP实现

本文详细介绍了使用PHP实现的冒泡排序、选择排序、插入排序、快速排序、希尔排序、归并排序及堆排序算法,旨在通过实践进行算法复习与沉淀。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于最近在找工作,面试中难免会遇到一些算法题,所以就用PHP把七大排序算法都实现了一遍,也当做是一种复习于沉淀。

  1. 冒泡排序 2. 选择排序 3. 插入排序 4. 快速排序 5. 希尔排序 6. 归并排序 7. 堆排序(较麻烦)
/**
 * 冒泡排序
 */
function bubble($arr) {
    $length = count($arr);
    for ($i=1; $i<$length; ++$i) {
        for ($j=0; $j < $length-$i; ++$j) {
            if ($arr[$j] > $arr[$j+1]) {
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $tmp;
            }
        }
    }
    return $arr;
}
/**
 * 选择排序
 */
function select($arr) {
    $length = count($arr);  
    for ($i=0; $i<$length-1; ++$i) {
        $minIndex = $i;
        for ($j=$i+1; $j<$length; ++$j) {
            if ($arr[$j] < $arr[$minIndex]) {
                $minIndex = $j;
            }
        }
        if ($minIndex != $i) {
            $tmp = $arr[$minIndex];
            $arr[$minIndex] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    return $arr;
}
/**
 * 插入排序
 */
function insert($arr) {
    $length = count($arr);  
    for ($i=1; $i<$length; ++$i) {
        $tmp = $arr[$i];
        for ($j=$i-1; $j>=0; --$j) {
            if ($tmp < $arr[$j]) {
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            } else {
                break;
            }
        }
    }

    return $arr;
}
/**
 * 快速排序
 */
function fast($arr) {
    $length = count($arr);
    if ($length < 1) {
        return [];
    }
    $mid = $arr[0];
    $left = [];
    $right = [];

    for ($i=1; $i<$length; ++$i) {
        if ($arr[$i] < $mid) {
            $left[] = $arr[$i];
        } else {
            $right[] = $arr[$i];
        }
    }
    
    $sortLeft = fast($left);
    $sortRight = fast($right);
    
    return array_merge($sortLeft, [$mid], $sortRight);
}
/**
 * 归并排序
 */
function merge($arr) {
    $length = count($arr);

    if ($length < 2) {
        return $arr;    
    }
    
    $left = [];
    $right = [];
    for ($i=0; $i<$length; ++$i) {
        if ($i < $length/2) {
            $left[] = $arr[$i];
        } else {
            $right[] = $arr[$i];
        }
    }

    $left = merge($left);
    $right = merge($right);

    $merge = [];
    while (count($left) > 0 && count($right) >0) {
        if ($left[0] < $right[0]) {
            $merge[] = array_shift($left);
        } else {
            $merge[] = array_shift($right);
        }
    }

    if (count($left) > 0) {
        $merge = array_merge($merge, $left);
    } elseif (count($right) > 0) {
        $merge = array_merge($merge, $right);
    }
    
    return $merge;
}
/**
 * 希尔排序
 */
function shell($arr) {
    $length = count($arr);  
    for ($gap = floor($length/2); $gap >0; $gap = floor($gap/2)) {
        for ($i=$gap; $i<$length; $i += $gap) {
            $tmp = $arr[$i];
            for ($j=$i-$gap; $j>=0; $j -= $gap) {
                if ($tmp < $arr[$j]) {
                    $arr[$j+$gap] = $arr[$j];
                    $arr[$j] = $tmp;
                } else {
                    break;
                }
            }
        }
        echo $gap."\n";
    }

    return $arr;
}
/**
 * 堆排序
 */
function heap($arr) {
    $length = count($arr);
    for ($i=floor($length/2)-1; $i>=0; --$i) {
        $arr = adjustHeap($arr, $i, $length);
    }

    for ($i=$length-1; $i>=0; --$i) {
        $tmp = $arr[0];
        $arr[0] = $arr[$i];
        $arr[$i] = $tmp;
        
        $arr = adjustHeap($arr, 0, $i);
    }   
    return $arr;
}

function adjustHeap($arr, $index, $length) {
    $lchild = 2*$index+1;
    $rchild = 2*$index+2;
    $max = $index;
    if ($index<=floor($length/2)-1) {
        if ($lchild<$length && $arr[$lchild] > $arr[$max]) {
            $max = $lchild;
        }
        if ($rchild<$length && $arr[$rchild] > $arr[$max]) {
            $max = $rchild;
        }
        if ($max != $index) {
            $tmp = $arr[$index];
            $arr[$index] = $arr[$max];
            $arr[$max] = $tmp;

            $arr = adjustHeap($arr, $max, $length);
        }
    }
    
    return $arr;
}

转载于:https://www.cnblogs.com/sunkeydev/p/5225165.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值