排序算法

<?php

$ar=array(2,8,4,56,1,23,41);

print_r(bubbleSort($ar));
print_r(quickSort($ar));
print_r(selectSort($ar));
print_r(insertSort($ar));


//冒泡排序
//法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来
function bubbleSort($arg){
    $count = count($arg);
    $temp  = 0;
    //外层循环,控制循环次数
    for($i=0;$i<$count-1;$i++){
        //内循环确定最大数
        for($j=0;$j<$count-1-$i;$j++){
            if($arg[$j]>$arg[$j+1]){
                $temp = $arg[$j];
                $arg[$j] = $arg[$j+1];
                $arg[$j+1] = $temp;
            }
        }
    }
   //return $arg;
}

//快速排序
//快速排序(Quicksort)是对冒泡排序的一种改进。
//由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,
//     其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,
//     整个排序过程可以递归进行,以此达到整个数据变成有序序列。
function quickSort($arg){
    $count = count($arg);
    if($count<=1){
        return $arg;
    }

    $key = $arg[0];
    $left_array =array();
    $right_array = array();
    for($i=1;$i<$count;$i++){
        if($arg[$i]<=$key){
            $left_array[] = $arg[$i];
        }else{
            $right_array[] = $arg[$i];
        }
    }

    //再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
    $left_array = quickSort($left_array);
    $right_array = quickSort($right_array);

    //return array_merge($left_array,array($key),$right_array);

}


//选择排序
//     每一趟从待排序的数据元素中选出最小(或最大)的一个元素,
//     顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法
//     冒泡排序比选择排序速度要快;
//     冒泡排序比选择排序消耗资源要多,对排序列表频繁修改

function selectSort($arg){

    $count = count($arg);
    for($i=0;$i<$count;$i++){
        //先假设最小的值的位置
        $minIndex = $i;
        //假设当前已知的最小的值
        $minVal  = $arg[$i];
        for($j=$i+1;$j<$count;$j++){
            if($minVal>$arg[$j]){
                //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
                $minIndex = $j;
                $minVal = $arg[$j];
            }
        }
        //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
        if($minIndex != $i) {
            $temp = $arg[$minIndex];
            $arg[$minIndex] = $arg[$i];
            $arg[$i] = $temp;
        }
    }
    //return $arg;
}


//插入排序
//     从第一个元素开始,该元素可以认为已经被排序
//    取出下一个元素,在已经排序的元素序列中从后向前扫描
//    如果该元素(已排序)大于新元素,将该元素移到下一位置
//    重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
//    将新元素插入到下一位置中
//    重复步骤2



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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值