插入排序

来源:互联网 发布:微信电影网站源码 编辑:程序博客网 时间:2024/06/03 15:17

原理

将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,是稳定的排序方法。

实现

从第二个元素开始往后,依次选择哨兵元素和前面的元素比较,如果前一个元素大于该哨兵元素(从小到大排序),则把前面那个元素移动到后一个位置;继续往前比较,直到找某个元素不大于该哨兵元素,则把哨兵元素插入到位置上。
插入排序的步骤:
1、第二个元素开始外后选择一个哨兵元素;
2、让哨兵元素和前面的元素进行比较,找到合适的位置插入;
3、循环上面两步,直到选择完所有元素;

function insertSort($arr) {    if (!is_array($arr) || count($arr) == 0)         return $arr;    $count = count($arr);    for ($i = 1; $i < $count; $i++) {         // 获取第二个元素的值        $tmp = $arr[$i];        // 获取前面的值的下标        $j = $i - 1;        // 如果前面的值比后面的值大,这里是从小到大        while ($arr[$j] > $tmp) {            // 把小的元素和前面的对换,直到移动到合适的位置,在移动下一个            $arr[$j + 1] = $arr[$j];            $arr[$j] = $tmp;            if ($j > 0)                $j--;        }    }    return $arr;}

时间空间复杂度

在最好的情况下(元素已经排好顺序):那么只需要循环 n-1 次就可以了,时间复杂度为 O(n)。
在最差的情况下 (元素是逆序的):要循环调整次数: [ n * (n-1) ] / 2 ,时间复杂度为 为 O(n²)。
平均时间复杂度为:O(n²)。

空间复杂度为 O(1)。

原创粉丝点击