PHP基本排序算法

基本排序算法

  • bubblesort 冒泡排序
  • insertsort 插入排序
  • shellsort 希尔排序
  • selectsort 简单查找排序
  • quicksort 快速排序
<?php
/*
* bubble的原理:数组的前两个数字对比
* 每次数字大的后移一位
* 如果数字的长度是10 需要最多排序9次
*/

function bubbleSort(array $numbers) {
    $cnt = count($numbers);
    // echo $cnt;exit;
    for ($i = 0; $i < $cnt - 1; $i++) {
        for ($j = 0; $j < $cnt - $i - 1; $j++) {
            if ($numbers[$j] > $numbers[$j + 1]) {
                $temp = $numbers[$j];
                $numbers[$j] = $numbers[$j + 1];
                $numbers[$j + 1] = $temp;
            }
        }
    }

    return $numbers;
}

/*
* insert_sort的原理
* 将数组分成两个区域,已经排序的区域和未排序的区域
* 直接套两层循环 区分区域  从未排序的区域取数到排序区域比较大小
*/

function insertsort(array $arr) {

    for($i=1, $len=count($arr); $i<$len; $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;
}


/*
* shell sort 希尔排序
* 高级的插入排序  shell是不稳定的排序
* 把数组通过增量分组  分组后再进行排序  通过增量  最后只剩下一组的方法
*/
function ShellSort(array $container)
{
    $count = count($container);
    //通过增量2将数组分成5个组 array的个数是10 
    for ($increment = intval($count / 2); $increment > 0; $increment = intval($increment / 2)) {
        //对分开的5个组就行直接插入排序 直到increment循环到1
        for ($i = $increment; $i < $count; $i++) {
            $temp = $container[$i];
            for ($j = $i; $j >= $increment; $j -= $increment) {
                if ($temp < $container[$j - $increment]) {
                    $container[$j] = $container[$j - $increment];
                } else {
                    break;
                }
            }
            $container[$j] = $temp;
        }
    }
    return $container;
}

/*
* select 排序方法
* 每次从带排序元素中取出最大或者最小的值放到起始位置
* 知道全部排完
* select排序是不稳定排序
*/
function SelectSort(array $container)
{
    $count = count($container);
    for ($i = 0; $i < $count; $i++){
        $k = $i;
        for ($j = $i + 1; $j < $count; $j++){
            if($container[$j] < $container[$k]){
                $k = $j;
            }
        }
        if($k != $i){
            $temp          = $container[$i];
            $container[$i] = $container[$k];
            $container[$k] = $temp;
        }
    }
    return $container;
}


/*
* quike sort
* 按基准排序  所有元素比基准小的元素排到前面
* 然后在前面和后面的元素中进行递归排序
*/
function QuickSort(array $container)
{
    $count = count($container);
    if ($count <= 1) { 
        return $container;
    }
    $pivot = $container[0];
    $left  = $right = [];
    for ($i = 1; $i < $count; $i++) {
        if ($container[$i] < $pivot) {
            $left[] = $container[$i];
        } else {
            $right[] = $container[$i];
        }
    }
    $left  = QuickSort($left);
    $right = QuickSort($right);
    return array_merge($left, [$container[0]], $right);
}

$num = array(20, 40, 60, 80, 30, 70, 90, 10, 50, 100);
$res = SelectSort($num);
print_r($res);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值