https://www.yduba.com/biancheng-2892530909.html

    插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置插入。插入排序在实现上,通常采用in-place排序(即只需要用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

    算法步骤
    1. 从第一个元素开始,该元素可以认为已经被排序
    2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
    3. 如果该元素(已排序大于新元素),将该元素移动到下一位置
    4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
    5. 将新元素插入到该位置后
    6. 重复步骤2~5

    效率分析
    如果目标是把n个元素的序列升级排序,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏的情况就是,序列是降序排列,那么此时需要进行的比较共有1/2 * n(n-1)次。插入排序的赋值操作是比较操作的次数加上(n-1)次。平均来说插入排序算法复杂度为O(n**2)**。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。插入排序在工业级库中也有着广泛的应用,在STL的sort算法和stdlib的qsort算法中,都将插入排序作为快速排序的补充,用于少量元素的排序。

    算法稳定性
    插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

    动图演示
    3插入排序 - 图1

    代码实现

    1. <?php
    2. function insertionSort(array $numbers = array())
    3. {
    4. $count = count( $numbers );
    5. if( $count <= 1 ) return $numbers;
    6. for($i = 1; $i < $count; $i ++)
    7. {
    8. $temp = $numbers[$i];
    9. for($j = $i-1; $j >= 0 && $numbers[$j] > $temp; $j --)
    10. {
    11. $numbers[$j+1] = $numbers[$j];
    12. }
    13. $numbers[$j+1] = $temp;
    14. }
    15. return $numbers;
    16. }