下面介绍用快速排序法和插入排序法来给一个一维数组排序
一、快速排序法:定一个标尺,把元素小于这个标尺的放在一个数组中,大于这个标尺的元素放在另一个数组中,得到两个数组分别进行上一步同样的操作,最后合并数组
具体代码实现如下:
// 快速排序法:
function quick_sort($arr) {
// 判断传过来的是否是一个数组
if(!is_array($arr)) {
return false;
}
// 获取数组的长度
$len = count($arr);
// 如果数组的<=1,说明不许排序
if($len <= 1) {
return $arr;
}
// 选择第一个元素作为标尺
$base = $arr[0];
// 初始化两个数组
$left_arr = array(); // 用于放小于标尺的元素
$right_arr = array(); // 用于放大于标尺的元素
// 循环数组对元素进行分组
for($i=1;$i<$len;$i++) {
if($base>$arr[$i]) {
$left_arr[] = $arr[$i];
} else {
$right_arr[] = $arr[$i];
}
}
// 再分别对这两个数组进行同样的排序处理
// 递归调用这个函数,并记录结果
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
// 合并数组
return array_merge($left_arr,array($base),$right_arr);
}
// 测试:
$arr = array(7,2,4,3,8,6);
var_dump(quick_sort($arr));
插入排序法:将要排序的元素插入到已经排序好的数组的指定位置
具体代码实现如下:
// 插入排序
function insert_into($arr) {
// 首先区分,哪部分是已经排序好的,那部分是没有排序好的元素
// 找到其中一二需要排序的元素,这个元素,就是从第二个元素开始,到最后一个元素都是需要排序的元素
$len = count($arr);
for($i=1;$i<$len;$i++) {
// 获取当前需要比较的元素值
$tmp = $arr[$i];
// 内层循环控制比较,并插入
for($j=$i-1;$j>=0;$j--) {
// $arr[$i]是需要插入的元素,$arr[$j]是需要比较的元素
if($tmp<$arr[$j]) {
// 发现插入的元素要小,交换位置
// 将后面的元素与前面的元素交换
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
} else {
// 如果碰不到需要移动的元素
// 由于已经排序好的元素,前面的就不需要再次比较了
break;
}
}
}
return $arr;
}
// 测试:
$arr = array(7,2,4,3,8,6);
var_dump(insert_into($arr));