02-插入排序

1 基本思想

插入排序算法是每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到所有元素插入完毕为止。

2 算法过程

1、将第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列;

2、从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面,这样的插入方式,排序是稳定的)。

3 算法图解

算法图解

4 PHP代码实现

/**
 * 插入排序: 每次往后多取一个元素, 和现有元素从后往前逐个比较, 比较大,就将现有元素后移一位
 * 时间复杂度: O(n2)
 * 空间复杂度: O(1)
 * 稳定排序
 */
function insertSort(&$arr) {
    $length = count($arr);
    for($i = 1; $i < $length; ++$i) {// 每次往后多取一个元素
        $temp = $arr[$i];
        for($j = $i - 1; $j >= 0; --$j) {// 和现有元素逐个从后往前比较
            if ($arr[$j] > $temp) { // 比较大,就将现有元素后移一位
                $arr[$j + 1] = $arr[$j];
                $arr[$j] = $temp;
            } else {
                break;
            }
        }
    }
}

$arr = [38, 19, 29, 91, 85, 12, 41, 21];
insertSort($arr);
print_r($arr);


function insertSort2(&$arr) {
    $length = count($arr);
    for($i = 1; $i < $length; ++$i) {// 每次往前多取一个元素
        for($j = 0; $j < $i; ++$j) {// 和现有元素逐个从前往后比较
            if ($arr[$j] > $arr[$i]) { // 找到第一个比它大的元素, 交换, 后续元素往后移一位
                list($arr[$i], $arr[$j]) = [$arr[$j], $arr[$i]];
            }
        }
    }
}

$arr = [38, 19, 29, 91, 85, 12, 41, 21];
insertSort2($arr);
print_r($arr);

5 效率分析

1、时间复杂度:O(n²) 最好的情况:待排序记录按关键字从小到大排列(正序),需要比较n-1次,不需要交换元素,时间复杂度为O(n); 最坏的情况:待排序记录按关键字从大到小排列(逆序),时间复杂度为O(n²)。 2、空间复杂度:O(1),是稳定排序。


Last modified March 8, 2022: Fix image path (67fc7f5)