几个简单易懂的排序算法php

  几个简单易懂的排序算法。排序算法,在应用到解决实际问题的时候(由于不一定总是数字排序),重点要分析出什么时候该交换位置。 

<?php


// 冒泡排序
function bubble_sort(array $arr){
    $len = count($arr) - 1;
    for($i=0; $i< $len; $i++){
        // 升序的话,两两比较第一轮排序过后,最后一个一定是最大的了;
        // 所以第二轮时$j依然从0开始,但是结束的时候只需要管前$len-1的长度
        for($j=0; $j < $len-$i; $j++){
            if ($arr[$j] > $arr[$j+1]){
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    return $arr;
}



// 选择排序
function select_sort(array $arr){
    $len = count($arr) - 1;
    for($i=0; $i< $len; $i++){
        for($j=$i+1; $j <= $len; $j++){
            // 选择排序,就是选择下边是$i的元素,固定住它,让它去和$j的比和交换
            if ($arr[$j] < $arr[$i]){
                $temp = $arr[$j];
                $arr[$j] = $arr[$i];
                $arr[$i] = $temp;
            }
        }
    }
    return $arr;
}



// 插入排序
/** 所谓插入排序法,就是检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。插入排序法主要的回圈有两个变数:i和j,每一次执行这个回圈,就会将第i个数字放到左边恰当的位置去。**/
function insert_sort(array $arr){ $len = count($arr) - 1; for($i=0; $i<= $len; $i++){ // 在$i位置前面的元素进行插入 for($j=$i; $j >0; $j--){ if ($arr[$j-1] > $arr[$j]){ $temp = $arr[$j]; $arr[$j] = $arr[$j-1]; $arr[$j-1] = $temp; } } } return $arr; } $arr = array(12, 9, 1, 4, 6, -3); $bubble = bubble_sort($arr); $select = select_sort($arr); $insert = insert_sort($arr); echo '<pre>'; print_r($bubble); echo '<pre>'; print_r($select); echo '<pre>'; print_r($insert); /** * Array ( [0] => -3 [1] => 1 [2] => 4 [3] => 6 [4] => 9 [5] => 12 ) */

排序算法,在应用到解决实际问题的时候(由于不一定总是数字排序),重点要分析出什么时候该交换位置。 

 

用冒泡法实现了一个简单的排序问题,题目是这样的。

 

<?php
$arr = array(
    'B5','D3','B4','B2','C5','A1','A2','A6','A4','A5','A6','B1','C1'
);

$len = count($arr) - 1;
for($i=0; $i< $len; $i++){
    for($j=0; $j < $len-$i; $j++){
        $first_1 = getstr($arr[$j]);
        $first_2 = getstr($arr[$j],1);
        $second_1 = getstr($arr[$j+1]);
        $second_2 = getstr($arr[$j+1],1);
        $con1 = $first_1=='A' &&
            ( $second_1!='A' || ($second_1=='A' && $first_2<$second_2)  );
        $con2 = $first_1!='A' && $second_1!='A' &&
            ($first_2<$second_2 || ($first_2==$second_2 && ord($first_1)<ord($second_1) ));

        if ($con1 || $con2){
            $temp = $arr[$j];
            $arr[$j] = $arr[$j+1];
            $arr[$j+1] = $temp;
        }
    }
}

// 取字符串 A1中的A或者1
function getstr($str,$type=0){
    return substr($str, $type,1);
}

print_r($arr);
echo array_shift($arr);

/**

 *
Array
(
[0] => C5
[1] => B5
[2] => B4
[3] => D3
[4] => B2
[5] => C1
[6] => B1
[7] => A6
[8] => A6
[9] => A5
[10] => A4
[11] => A2
[12] => A1
)
 *
 *
C5
 */

 

posted @ 2016-01-14 19:21  根号五  阅读(419)  评论(0编辑  收藏  举报