本文将介绍快速排序、计数排序、梳排序、堆排序、归并排序、希尔排序、选择排序、插入排序、地精排序、联合冒泡排序、鸡尾酒排序、冒泡排序、奇偶排序、使用标志的冒泡排序14种排序算法的实现。本文是由于阅读了文章《测试评估:14种排序算法和PHP数组》,才有想法学习、实现并总结这些算法,特此分享,陆续补充。
快速排序
1、思想:主要采用了递归和分治的思想。选择标尺后,进行遍历数组,将大于标尺的放到一个数组,将小于标尺的放置到一个数组。再递归调用本函数并记录结果。
2、实现
function quickSort($arr) {
//先判断是否需要继续进行
$length = count($arr);
if($length <= 1) {return $arr;}
//选择一个标尺,通常选择第一个元素
$base_num = $arr[0];
//初始化
$left = array();//小于标尺的
$right = array();//大于标尺的
for($i=1;$i<$length;$i++) {
if($base_num > $arr[$i]) {
$left[] = $arr[$i];
}else {
$right[] = $arr[$i];
}
}
//递归调用并记录
$left = $this->quickSort($left);
$right = $this->quickSort($right);
//合并
return array_merge($left,array($base_num), $right);
3、输入$arr = array(12, 100, 3, 20, 11,50);
4、输出
array:6 [▼
0 => 3
1 => 11
2 => 12
3 => 20
4 => 50
5 => 100
]
计数排序
1、此算法,是一种稳定的线性时间排序算法。其基本思想是,用待排序的数作为计数数组的下标,统计每个数字的个数。然后依次输出即可得到有序序列。但是理解比较难,本人还没理解通透,但是总结了几个步骤:
找出数组$arr中最大的数$max
初始化用来计数的数组$count_arr,数组大小为$max
对于计数数组$count_arr键值等于$arr[$i]的值加1
计数数组$count_arr相邻的两个值相加
键值翻转得到数组$over_turn
loop$over_turn,按照顺序push到最终的数组$result
2、实现
function countingSort($arr) {
$length = count($arr);
if($length <= 1) return $arr;
$size = count($arr);
$max = $arr[0];
//找出数组中最大的数
for($i=1;$i<$size;$i++) {
if($max < $arr[$i]) $max = $arr[$i];
}
//初始化用来计数的数组
for ($i=0;$i<=$max;$i++) {
$count_arr[$i] = 0;
}
//对计数数组中键值等于$arr[$i]的加1
for($i=0;$i<$size;$i++) {
$count_arr[$arr[$i]]++;
}
//相邻的两个值相加
for($i=1;$i<=$max;$i++) {
$count_arr[$i] = $count_arr[$i-1] + $count_arr[$i];
}
//键与值翻转
for ($i=$size-1;$i>=0;$i--) {
$over_turn[$count_arr[$arr[$i]]] = $arr[$i];
$count_arr[$arr[$i]]--; // 前一个数找到位置后,那么和它值相同的数位置往前一步
}
//按照顺序排列
$result = array();
for ($i=1;$i<=$size;$i++) {
array_push($result,$over_turn[$i]);
}
return $result;
}
3、输入$arr = array(8,6,1,3,4)
4、输出
array:5 [▼
0 => 1
1 => 3
2 => 4
3 => 6
4 => 8
]
梳排序
1、思想:梳排序同样基于冒泡排序,梳排序比较的是固定距离处的数的比较和交换,类似希尔那样。是一种不稳定的排序算法。
2、实现
function combSort($arr) {
$length = count($arr);
$step = (int)floor($length/1.3);
while($step >= 1) {
for($i=0;$i<$length;$i++) {
if($i+$step<$length && $arr[$i]>$arr[$i+$step]) {
$temp = $arr[$i];
$arr[$i] = $arr[$i+$step];
$arr[$i+$step] = $temp;
}
if($i+$step>$length) {
break;
}
}
$step = (int)floor($step/1.3);
}
return $arr;
}
3、输入$arr = array(8,4,3,7,6,5,2,1)
4、输出
array:8 [▼
0 => 1
1 => 2
2 => 3
3 => 4
4 => 5
5 => 6
6 => 7
7 => 8
]
待补充
参考文章
测试评估:14种排序算法和PHP数组:http://blog.jobbole.com/68774/