<?php
// 冒泡排序法
//$arr = array(0,5,-1,3,4,5,32,22,-3,-4,-7);
//var_dump($arr);
function arr_sort($arr){
for ($a = 1; $a <= count($arr) ; $a++) {
for ($i=0; $i < count($arr)-$a ; $i++) {
if ($arr[$i] > $arr[$i+1]) {
$temp = $arr[$i];
$arr[$i] = $arr[$i+1];
$arr[$i+1] = $temp;
}
}
}
return $arr;
}
//var_dump(arr_sort($arr));
//选择排序法 原理: 先认为第一个位置的是最值,然后将自己放入一个临时值(minVal),然后去和无序区比较,如果发现minval
//不是最值,那就将新的最值和自己对换,完毕后,将最值放入原本的位置;
//这样,前面的值都是有序的了
function selectSort($arr){
$temp = 0;
for ($i=0; $i <count($arr)-1 ; $i++) { //最后一次不必要比较,因为前面都已经有序了
//记录有序区的最新那个值 和下标 用于新的最值进行插入
$minVal = $arr[$i];
$minIndex = $i;
for ($j=$i+1; $j <count($arr) ; $j++) { //$i+1:墙面都有序了,无需比较,所以要被排查的数组变短了
if ($minVal < $arr[$j]) {//在无序区取出最值
$minVal = $arr[$j];
$minIndex = $j;//记录下标是因为:该下标会一直被刷新,直到最值,然后用于和有序区最后的那个值对换
//保证正真的对换只发生一次就好
}
}
if ($i != $minIndex) {//最值小标不一样才对换
$temp = $arr[$i];
$arr[$i] = $arr[$minIndex];
$arr[$minIndex] = $temp;
}
}
return $arr;
}
// var_dump(selectSort($arr));
//插入排序 原理:开始从数组的第二位开始,和前面比较前 先将比较的值记录在temp临时变量里面
//发现 比自己小的值就将小的值复制然后 放在自己当时的位置下标处,这样就会有两个一样的值了;将要比较的新值 继续往前寻找(由key决定)
//发现不满足条件的,就取当前位置的下标,将自己插入 整个过程只有插入,没有替换
function insertSort($arr){
for ($i=1; $i < count($arr) ; $i++) {
$temp = $arr[$i];
$key = $i-1;
while ($key>=0 && $temp<$arr[$key]) {
$arr[$key+1] = $arr[$key];
$key--;//注意key移动到了一个未知的值,如果下次比较不会进入这个循环,绝对会导致temp对换的目标错误
}//直到temp找到合适的位置那就退出循环,或者到顶了
if (($key+1)!=$i) {//和temp比较的数不是本身的前一位,如果是前一位,那就不用插入,自己待在自己的位置
$arr[$key+1] = $temp;
}
}
return $arr;
}
//快速排序法 特点,第一遍历,K的值不变 具体原理:只想说不简单 百度去
function quickSort($array)
{
if(!isset($array[1]))
return $array;
$mid = $array[0]; //获取一个用于分割的关键字,一般是首个元素
$leftArray = array();
$rightArray = array();
foreach($array as $v)
{
if($v > $mid)
$rightArray[] = $v; //把比$mid大的数放到一个数组里
if($v < $mid)
$leftArray[] = $v; //把比$mid小的数放到另一个数组里
}
$leftArray = quickSort($leftArray); //把比较小的数组再一次进行分割
$leftArray[] = $mid; //把分割的元素加到小的数组后面,不能忘了它哦
$rightArray = quickSort($rightArray); //把比较大的数组再一次进行分割
return array_merge($leftArray,$rightArray); //组合两个结果
}
//来个20W的数据测试
$arr = array();
for ($i=0; $i <200000 ; $i++) { //上200W数据就爆内存了
$arr[] = mt_rand(0,9999);
}
echo '执行前'.date('Y-m-d h:i:s').'<br>';
quickSort($arr);
echo '执行后'.date('Y-m-d h:i:s');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>四种数组排序法</title>
</head>
<body>
</body>
</html>