本意是想研究一下希尔排序的,因为希尔排序和快速排序没有争议的是排序最快的两种算法,但无奈希尔排序是以插入排序为基础的,所以只得先研究一下插入排序.
插入排序基本思想:
插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的数据序列的适当位置,直到全部记录插入完成为止。
假设待排序的记录存放在数组R[0…n-1]中。初始时,R[0]自成1个有序区,无序区为R[1…n-1]。从i=1起直至i= n-1为止,依次将R[i]插入当前的有序区R[0…i-1]中,生成含n个记录的有序区。通常将一个记录R[i](i=1,2,…,n-1)插入到当前的有序区,使得插入后仍保证该区间里的记录是按关键字有序的操作称第i趟插入排序。排序过程的某一中间时刻,R被划分成两个子区间R[0…i-1](已排好序的有序区)和[i…n-1](当前未排序的部分,可称无序区)。插入排序的基本操作是将当前无序区的第1个记录R[0]插人到有序区R[0…i-1]中适当的位置上,使 R[0…i]变为新的有序区。因为这种方法每次使有序区增加1个记录,通常称增量法。
排序示意图:
代码实现 :
//插入排序
function insertSort($arr)
{
$count = count($arr);
for ($i = 1; $i < $count; $i++)
{
$temp = $arr[$i];//设置哨兵
for ($j = $i-1; $j >= 0; $j--)
{
if($arr[$j] > $temp)
{
$arr[$j+1] = $arr[$j];
$arr[$j] = $temp;
}
}
}
return $arr;
}
$arr = array(70,30,40,10,80,20,90,100,75,60,45);
var_dump(insertSort($arr));
结果:
array (size=11)
0 => 10
1 => 20
2 => 30
3 => 40
4 => 45
5 => 60
6 => 70
7 => 75
8 => 80
9 => 90
10 => 100
(size=11)
0 => 10
1 => 20
2 => 30
3 => 40
4 => 45
5 => 60
6 => 70
7 => 75
8 => 80
9 => 90
10 => 100