插入排序法
所谓插入排序法乃是将一个数目插入该占据的位置。
假设我们输入的是 “5,1,4,2,3” 我们从第二个数字开始,这个数字是1,我们的任务只要看看1有没有正确的位置,我们的做法是和这个数字左边的数字来比,因此我们比较1和5,1比5小,所以我们就交换1和5,原来的排列就变成了“1,5,4,2,3 ”
接下来,我们看第3个数字有没有在正确的位置。这个数字是4,它的左边数字是5,4比5小,所以我们将4和5交换,排列变成了 “1,4,5,2,3 "我们必须继续看4有没有在正确的位置,4的左边是1,1比4小,4就维持不动了。
再来看第四个数字,这个数字是2,我们将2和它左边的数字相比,都比2大,所以就将2一路往左移动,一直移到2的左边是1,这时候排序变成了 “1,2,4,5,3 ”
最后,我们检查第五个数字,这个数字是3,3必须往左移,一直移到3的左边是2为止,所以我们的排列就变成了 “1,2,3,4,5 ”排序因此完成了。
所谓插入排序法,就是检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。插入排序法主要的回圈有两个变数:i和j,每一次执行这个回圈,就会将第i个数字放到左边恰当的位置去 。
复杂度分析
排序方法 | 时间复杂度 | 空间复杂度 | 稳定性 | 复杂性 | ||
平均情况 | 最坏情况 | 最好情况 | ||||
插入排序 | O(n2) | O(n2) | O(n) | O(n) | 稳定 | 简单 |
插入排序原理很简单,将一组数据分成两组,我分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。当然,插入过程中涉及到了元素的移动。
基本思想
输入一个元素,检查
数组列表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕。
<?php
/**
* 插入排序:
*
* 一、从数组的第1个元素开始遍历至第n个。(n为数组的长度)
* 二、对于每一个遍历到的元素:
* 2.1 向前倒着找(已经排好序的)自己的位置。
* 2.2 如果不符合条件,则前面的元素向后移动,与之交互位置。
* 直至条件符合。
*/
function InsertSort($arr)
{
for ($i=0; $i <count($arr) ; $i++)
{
//获取一个有序的值
$temp=$arr[$i];
//循环需要插入
for ($j=$i-1; $j >=0; $j--) {
//判断 同时跟temp进行比较
if($temp < $arr[$j])
{
$arr[$j+1]=$arr[$j];
$arr[$j]=$temp;
}else{
break;
}
}
}
return $arr;
}
//假设需要排序的数组
$arr=array(5,1,2,3,4,11,6,8,9);
print_r(InsertSort($arr));
?>
<?php
/**
* 插入排序:
*
* 一、从数组的第1个元素开始遍历至第n个。(n为数组的长度)
* 二、对于每一个遍历到的元素:
* 2.1 向前倒着找(已经排好序的)自己的位置。
* 2.2 如果不符合条件,则前面的元素向后移动,与之交互位置。
* 直至条件符合。
*/
function InsertSort($arr)
{
for ($i=0; $i <count($arr) ; $i++)
{
//获取一个有序的值
$temp=$arr[$i];
//循环需要插入
for ($j=$i-1; $j >=0; $j--) {
//判断 同时跟temp进行比较
if($temp < $arr[$j])
{
$arr[$j+1]=$arr[$j];
$arr[$j]=$temp;
}else{
break;
}
}
}
return $arr;
}
//假设需要排序的数组
$arr=array(5,1,2,3,4,11,6,8,9);
print_r(InsertSort($arr));
?>