1 冒泡排序
<?php
/**
* 冒泡排序(从小到大)
* 基本思想:两两比较相邻记录,一次循环确定一个数
* 在所有的排序算法中是最慢的,尤其当数据量较大的时候,数据小体现不出来
*/
$arr = array(21, 95, 82, 15, 36);
function bubbleSort(&$arr)
{
$num = count($arr); //元素数据个数
for($i = 0; $i < $num-1; ++$i)
{
for($j = 0; $j < $num-1-$i; ++$j)
{
if($arr[$j] > $arr[$j+1]) { //如果前面的数大于后面的数,交换位置
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
}
bubbleSort($arr); //调用函数
echo '<pre>';
var_dump($arr); //输出排序后的数组
2 选择排序
<?php
/**
* 选择排序(从小到大)
* 基本思想:选择,顾名思义,先选择(找到)合适的数据,然后进行交换。
* 对于本例,首先在先假设第0个元素为最小值,然后与第1到第n-1个数据依次比较,其中最小的值与第0个元素的值进行交换
*/
$arr = array(21, 95, 82, 15, 36);
function selectSort(&$arr)
{
$num = count($arr); //元素数据个数
for($i = 0; $i < $num-1; ++$i) //大循环的次数
{
$min_value = $arr[$i]; //既然要先检索出最小值,这个最小值怎么确定?我们先假设一个值,这个值是有规律可循的
$min_index = $i;
for($j = $i+1; $j <= $num-1; ++$j)
{
if($min_value > $arr[$j]) //如果假定的最小值还大于后续其他数据,则交换位置
{
$min_value = $arr[$j];
$min_index = $j;
}
} //每一次循环结束都会确定一个本次循环真正的最小值
$arr[$min_index] = $arr[$i]; //真正的最小值所在位置替换为假定的最小值
$arr[$i] = $min_value; //假定的最小值替换为真正的最小值
}
}
selectSort($arr); //将需要排序的数组传入
echo '<pre>';
var_dump($arr); //输出排序后的数组
3 插入排序
<?php
/**
* 选择排序(从小到大)
* 基本思想:类似扑克插牌,以一个(多个)数据为基准,往后每摸一张牌,与以前的数据依次比较大小,然后有序插入
*/
$arr = array(21, 95, 82, 15, 36);
$arr = array(21, 14);
function insertSort(&$arr)
{
$num = count($arr);
for($i = 1; $i < $num; ++$i)
{ //我们知道,数组的第0个元素是不用进行排序的,所以需要给$num-1个数据进行排序
$insert_value = $arr[$i]; //先把需要插入的数据记录下来
$compare_index = $i-1; //先假设与插入数据比较的数据的下标为前一个元素的下标
while($arr[$compare_index] > $insert_value && $compare_index >= 0) //如果,比较的数据大于插入的数据
{
$arr[$compare_index + 1] = $arr[$compare_index]; //把比较的元素放后面,此时compare_index+1和compare_index的位置为同一值
--$compare_index; //比较的元素下标-1
}
$arr[$compare_index + 1] = $insert_value; //当推出循环,证明比较的数据小于插入的数据,所以,$compare+1位置就是插入位置
}
}
insertSort($arr); //传入数组进行排序
echo '<pre>';
var_dump($arr); //输出数组