本意是想研究一下希尔排序的,因为希尔排序和快速排序没有争议的是排序最快的两种算法,但无奈希尔排序是以插入排序为基础的,所以只得先研究一下插入排序.
插入排序基本思想:
插入排序(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 => 101 => 202 => 303 => 404 => 455 => 606 => 707 => 758 => 809 => 9010 => 100
(size=11)0 => 101 => 202 => 303 => 404 => 455 => 606 => 707 => 758 => 809 => 9010 => 100