一、插入排序
- 算法思想:每步将一个待排序的值,按其值的大小插入前面已经排完序的序列中适当的位置上,直到全部插入完为止。(稳定排序)
- 排序过程:(默认升序)
- 原始数据:
5,2,1,3,7,4
; - 第一次排序(待排序值:
2
):{5,5},1,3,7,4
;{2,5},1,3,7,4
; - 第二次排序(待排序值:
1
):{2,5,5},3,7,4
;{2,2,5},3,7,4
;{1,2,5},3,7,4
; - 第三次排序(待排序值:
3
):{1,2,5,5},7,4
;{1,2,3,5},7,4
; - 第四次排序(待排序值:
7
):{1,2,3,5,7},4
; - 第五次排序(待排序值:
4
):{1,2,3,5,7,7}
;{1,2,3,5,5,7}
;{1,2,3,4,5,7}
;
- 算法代码:
<?php
$array = array(5, 2, 1, 3, 7, 4);
print_r(insertSort($array));
function insertSort($array)
{
$n = count($array);
for ($i = 1; $i < $n; $i++) {
$temp = $array[$i];
for ($j = $i; $j > 0 && $temp < $array[$j - 1]; $j--) {
$array[$j] = $array[$j - 1];
}
$array[$j] = $temp;
}
return $array;
}
二、选择排序
- 算法思想:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。(不稳定排序)
- 排序过程:(默认升序)
- 原始数据:
5,2,1,3,7,4
; - 第一次排序:
1,2,5,3,7,4
; - 第二次排序:
1,2,5,3,7,4
; - 第三次排序:
1,2,3,5,7,4
; - 第四次排序:
1,2,3,4,7,5
; - 第五次排序:
1,2,3,4,5,7
;
- 算法代码:
<?php
$array = array(5, 2, 1, 3, 7, 4);
print_r(selectSort($array));
function selectSort($array)
{
$n = count($array);
for ($i = 0; $i < $n - 1; $i++) {
$min = $i;
for ($j = $i + 1; $j < $n; $j++) {
if ($array[$j] < $array[$min]) {
$min = $j;
}
}
if ($array[$i] != $array[$min]) {
list(array[$i], $array[$min]) = array($array[$min], array[$i]);
}
}
return $array;
}
三、冒泡排序
- 算法思想:每一次遍历都找出一个最大的数字放在最后.具体实现就是从最开始进行两两比较,若两者构成逆序,则进行位置调换。(稳定排序)
- 排序过程:(默认升序)
- 原始数据:
5,2,1,3,7,4
; - 第一次排序:
2,1,3,5,4,7
; - 第二次排序:
1,2,3,4,5,7
; - 第三次排序:
1,2,3,4,5,7
; - 第四次排序:
1,2,3,4,5,7
; - 第五次排序:
1,2,3,4,5,7
;
- 算法代码:
<?php
$array = array(5, 2, 1, 3, 7, 4);
print_r(bubbleSort($array));
function bubbleSort($array) {
$n = count($array);
for ($i = 0; $i < $n -1; $i++) {
for ($j = 0; $j < $n - 1 - $i; $j++) {
if ($array[$j] > $array[$j+1]) {
$array[$j] = $array[$j] ^ $array[$j+1];
$array[$j+1] = $array[$j] ^ $array[$j+1];
$array[$j] = $array[$j] ^ $array[$j+1];
}
}
}
return $array;
}
四、快速排序
- 算法思想:取第一个或最后一个称为基准,也可以随机取,然后就是比基准小的在左边,比基准大的放到右边,基准插入到中间,然后再按照同样的方法把左右两连进行递归快速排序,直到不能分解为止。(不稳定排序)
- 排序过程:(默认升序)
- 原始数据:
5,2,1,3,7,4
; - 第一次分治:
{4,2,1,3},{5},{7}
; - 第一次递归:
{3,2,1},{4},{5},{7}
; - 第二次递归:
{1,2},{3},{4},{5},{7}
; - 第三次递归:
{1,2,3,4,5,7}
;
- 算法代码:
<?php
$array = array(5, 2, 1, 3, 7, 4);
quickSort($array, 0, count($array) - 1);
print_r($array);
function quickSort(&$arr, $l, $r)
{
if ($l >= $r) return;
$v = $arr[$l];
$j = $l;
for ($i = $l + 1; $i <= $r; $i++) {
if ($arr[$i] < $v) {
$j++;
list($arr[$j], $arr[$i]) = array($arr[$i], $arr[$j]);
}
}
list($arr[$l], $arr[$j]) = array($arr[$j], $arr[$l]);
quickSort($arr, $l, $j - 1);
quickSort($arr, $j + 1, $r);
}
- 复杂度分析:
- 时间复杂度:O(nlogn)。
- 空间复杂度:O(1)。