php排序算法之插入排序

目录

一: 原理

二: 举例说明

三: 插入排序步骤

四: PHP代码实现插入排序


一: 原理

       插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

二: 举例说明

原始数组:     10   9   5   12  1           默认10已经被排序,称为有序区,9,5,12,1未排序,成为无序区

第一次排序:  9   10  5   12  1           取出无序区第一个元素10,在有序区元素序列中从后往前面扫描,如果该元素(已排序的10)大于                                                          新元素9,则10移动下一个位置,新元素9占据10的位置

第二次排序:  5   9  10  12  1            取出5跟10比较,10往后移一个位置;再用5跟9比较,9后移一个位置,5占据元素9的位置

第三次排序:  5   9  10  12  1

第四次排序:  1   5   9   10  12 

三: 插入排序步骤

1. 从第一个元素开始,该元素可以认为已经被排序,比如上面例子中10;

2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;

3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;

4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

5. 将新元素插入到该位置中;

6. 重复步骤2;

eg:  比如上例子:  第二次排序时,取出5,在已经排序区9,10中从后向前扫描,第一次比较5和10,10比5大,10移动到下一个位置,然后再把5同9比较,9比5大,9在往后移动一个位置;此时5已经在已排序区第一个位置了,就把5放在这个这个位置,然后循环操作排序;

四: PHP代码实现插入排序

1.将数组分成两个区域:已排序区域和未排序区域。首先假设数组的第一个元素处于已排序区域,第一个元素之后的所有元素都处于未排序区域。

2. 排序时用到两层循环,第一层循环用于从未排序区域中取出待排序元素,并逐步缩小未排序区域,第二层循环用于从已排序区域中寻找插入位置(即不断地从已排序区域中寻找比待排序元素大的元素,然后将较大的已排序区的元素后移,后移的最终结果是已排序区元素的最后一个元素占据, 待排序元素原来的位置,而已排序区中间空出一个位置),最后将待排序元素插入元素后移后留下的空位;

3.实现:

<?php
//插入排序
function insertSort(&$arr)
{
    $count = count($arr); //计算排序元素个数
    /**
     * 第一层循环用于从未排序区域中取出待排序元素,并逐步缩小未排序区域,
     * 第二层循环用于从已排序区域中寻找插入位置      * 
     */
    for ($i = 1; $i < $count; $i++)
    {
        //获得当前需要比较的元素值
        $temp = $arr[$i];
        //内层循环控制 比较 并 插入
        for ($j = $i-1; $j >= 0; $j--)  
        {
            /**
             * $temp需要插入的元素;
             * $arr[$j]需要比较的元素
             */
            if($arr[$j] > $temp)
            {
                /**
                 * 发现插入的元素要小,交换位置
                 * 将后边的元素与前面的元素互换
                 */
                $arr[$j+1] = $arr[$j];
                //将前面的数设置为当前需要交换的数
                $arr[$j] = $temp;
            }
            else
            {
                /**
                 * 如果碰到不需要移动的元素
                 * 由于是已经排序好是数组,则前面的就不需要再次比较了。
                 */
                break;
            }
        }
    } 
    //将这个元素 插入到已经排序好的序列内,返回
    return $arr;
}

//调用插入排序实现元素排序
$arr = array(1,100,121,99,12);
insertSort($arr);
print_r($arr); 

?>

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值