浅谈算法——插入排序性能分析
前两天看得是快速排序和冒泡排序,今天学习一下插入排序,可以说插入排序比前两种方便很多。
/** * 插入排序 */ function insert_sort2($_array) { for($i=0;$i<count($_array);$i++) { $key = $_array[$i]; for($j=$i;$j>0;$j--) { if ($key<$_array[$j-1]) { $_array[$j] = $_array[$j-1]; } else { break; } } $_array[$j] = $key; } return $_array; } /* * 生成随机数组 */ function rand_array($_num) { for($i=0;$i<$_num;$i++) { $array[$i] = rand(0,$_num*10); } return $array; } $rand_array = rand_array(100); print_r($rand_array); $start = time(); $result = insert_sort2($rand_array); $end = time(); print_r($result); echo "插入排序需要的时间" . ($end - $start) . "秒;";
测试:8秒钟,明显比冒泡排序快很多,但是比快速排序要是慢一些,这是因为在冒泡排序下是进行值交换,而在插入排序下是值移动,所以直接插入排序将要优于冒泡排序,时间在3倍左右。
性能分析:
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。