php实现插入排序

1.插入排序的概念

它是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

其实这个我们并不陌生,举一个现实中的小例子,我们都打过扑克,拿到牌时,就需要对扑克进行抹顺,一般都是按着左右是从小到大的顺序,新来了一张牌,我们是不是一张一张的进行比较,找到它合适的位置,这就是插入排序。


2.代码实现

function InsertSort(&$arr){ //这个是取数组的地址,这样这个数组的值也能改变
    for ($i=1;$i<count($arr);$i++) {    //从1开始,因为第0个是有序的
        $target = $arr[$i]; //将目标数用一个变量保存起来
        $j = $i;
        while ($j>0 && $target < $arr[$j-1]) {  //从目标数的前一个开始向前循环,当前数比目标数小,就将当前数向前挪一个,腾出一个位置
            $arr[$j] = $arr[$j-1];
            $j--;
        }
        $arr[$j] = $target; //循环完了,找到了目标数合适的位置,将目标数放到位置上
    }
}
$arr = [12,56,98,32,16,34,2,9,1];
InsertSort($arr);
dump($arr);

上面是相应的代码,关键步骤上有标注。

3.复杂度分析

①先将第一个元素视为有序,第二个元素与第一个元素比较,若比第一个元素小,则插入到第一个元素之前。第三个元素依次与第二个元素、第一个元素比较(前三 个元素有序);第四个元素依次与第三个、第二个、第一个元素比较,插入到合适位置以形成一个有序表(即此时前四个元素有序)因此,直接插入排序算法是逐步 地形成一个有序序列的。也即在表的前头形成一个局部有序序列。
②不论初始序列如何,总需要 N-1 趟排序,第一趟是第二个元素与第一个元素比,第二趟是第三个元素与前二个元素比,第三趟是第四个元素与前三个元素比……
③当初始序列有序时,第一趟只需比较一次,第二趟只需比较一次,第三趟也只需比较一次……总共只需比较 N-1 次即可完成排序。当初始序列逆序时,第一趟比较一次,第二趟比较二次,……第 N-1 趟比较 N-1 次。总共比较 n(n-1)/2 次。
④直接插入排列是基于明确的相邻位置的两个元素的比较,因此该算法是稳定的。排序过程的比较次数与待排序列的初始状态有关。每进行一趟排列并不能唯一地确定下一个元素的最终位置。

因此最好的情况是O(n),最坏的情况是O(n2) n的平方。

猜你喜欢

转载自blog.csdn.net/u013252047/article/details/79222503