- 算法中术语说明
- 稳定性:如果排序前A在B的前面,经过排序后,A依然在B的前面,就说这个算法是稳定的,反之则是不稳定的。
- 原地排序:指的是空间复杂度O(1)的算法,排序中不需要额外的内存空间。
- 时间复杂度: 一个算法执行所耗费的时间。
- 空间复杂度:运行完一个程序所需额外内存(除了待排序数据之外占用的内存)的大小。
我们今天主要讲解冒泡排序、插入排序,选择排序,这三个排序的时间复杂度都是O(n^2),空间复杂度O(1),都是原地排序。另外提一句虽然他们的时间复杂度虽然都是O(n^2),但是插入排序更受欢迎,大家知道是为什么吗?
下面先上代码
冒泡排序
function bubbleSort($array)
{
$count = count($array);
if($count <= 1) return $array;
for ($i = 0; $i < $count; $i ++) {
for ($j = 0; $j < $count-$i-1; $j++) {
if ($array[$j] > $array[$j+1]) {
$tmp = $array[$j];
$array[$j] = $array[$j+1];
$array[$j+1] = $tmp;
}
}
}
return $array;
}
选择排序
function selectionSort($array)
{
$count = count($array);
if ($count <= 1) return $array;
for ($i = 0; $i < $count; $i++) {
$min = $i;
for ($j = $i; $j < $count; $j++) {
if ($array[$j] < $array[$min]) {
$min = $j;
}
}
$tmp = $array[$min];
$array[$min] = $array[$i];
$array[$i] = $tmp;
}
return $array;
}
插入排序
function insertionSort($array)
{
$count = count($array);
if ($count <= 1) return $array;
for ($i = 1; $i < $count; $i++) {
$tmp = $array[$i];
$j = $i - 1;
for (; $j >=0; $j--) {
if ($array[$j] > $tmp) {
$array[$j+1] = $array[$j];
} else {
break;
}
}
$array[$j+1] = $tmp;
}
return $array;
}