美文网首页
算法与数据结构系列 ( 四 ) - 插入排序法- Insert

算法与数据结构系列 ( 四 ) - 插入排序法- Insert

作者: NiceYu | 来源:发表于2020-05-29 13:10 被阅读0次

前言

本章我们继续理解另外一个排序算法 插入排序
插入排序 也算是我们 O(n^2) 的经典排序算法之一
插入排序 其实非常简单, 在我们日常当中也是常见的一种思想
可能相对而言大家并没有归类总结。所以可能大家使用过,但是并不知晓。

举个生活栗子

我们在打 扑克牌 的时候,我们整理牌的思想,差不多就是 插入排序 的思想。
换句话说,就是把牌插入到相对合适的位置。
当我们把手上所有的牌插入到指定位置,我们的牌就插入完成了

插入排序,先简单了解一下思路

  • 首先我们有这么一段数据,我们需要将他们重新整合有序
    | 7 | 2 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第一次排序
  • 用插入排序的思路就是先找到拿到数字坐标 0 也就是 7
  • 但是和选择排序不同的时候,此时我们并不会去移动 7
    | 7 | 2 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第二次排序
  • 接下来我们继续对数字坐标 1 的数字,和前面的数字进行一个对比
  • 显然 27 小,我们就将 2 放在 7 的前面
  • 此时| 2 | 7 |已然排序完成
    | 2 | 7 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第三次排序
  • 接下来我们继续对数字坐标 2 的数字,和前面的数字进行一个对比
  • 显然 17小,我们就将 1 放在 7 的前面
  • 然后再拿 12 对比,12 小,我们就将 1 放在 7 的前面
  • 此时 | 1 | 2 | 7 | 已然排序完成
    | 1 | 2 | 7 | 5 | 4 | 6 | 9 | 3 | 8 |
第四次排序
  • 接下来我们继续对数字坐标 3 的数字,和前面的数字进行一个对比
  • 显然 57小,我们就将 5 放在 7 的前面
  • 然后再拿 52 对比,52 大,我们就将 5 原定不动
  • 此时| 1 | 2 | 5 | 7 |已然排序完成
    | 1 | 2 | 5 | 7 | 4 | 6 | 9 | 3 | 8 |

TimAutumnWind (转载请注明出处 https://learnku.com/users/48310

此后一直以此类推,直至到底

实现一下代码 - for

  • 时间和性能记录,可以参照章节三中的 选择排序
  • 以后会直接实现代码
/**
 * 插入排序操作方法  - for
 * @param $sort
 * @param $n
 * @return mixed
 */
function get_insertion_sort_for($sort,$n){
    /** 将数据循环一次 */
    for ($i = 0; $i < $n; $i++ ){
        /** 将前面数据进行循环 */
        for($j = $i;$j > 0; $j--){
            /** 如果当前数字小于前面数字,则为 true */
            if($sort[$j] < $sort[$j - 1]){
                /** 
                 *  如果当前数字小于前面数字,则进行位置交换
                 *  php 没有位置交换的函数,所以简单一点,先取出,再覆盖
                 */
                $val = $sort[$j];
                $sort[$j] = $sort[$j - 1];
                $sort[$j - 1] = $val;
            }else{
                /** 如果大于前面数字,则跳出,不进行位置交换 */
                break;
            }
        }
    }
    return $sort;
}

实现一下代码 - while

  • tips: 在 php 当中,while 要比 for 快一丢丢
/**
 * 插入排序操作方法 - while
 * @param $sort
 * @param $n
 * @return mixed
 */
function get_insertion_sort_while($sort,$n){
    $i = 0;
    while ( $i < $n ){
        $j = $i;
        while($j > 0){
            if($sort[$j] < $sort[$j - 1]){
                $val = $sort[$j];
                $sort[$j] = $sort[$j - 1];
                $sort[$j - 1] = $val;
            }else{
                break;
            }
            $j--;
        }
        $i++;
    }
    return $sort;
}

相关文章

网友评论

      本文标题:算法与数据结构系列 ( 四 ) - 插入排序法- Insert

      本文链接:https://www.haomeiwen.com/subject/fauxzhtx.html