算法(algorithms)基础之:插入排序

2 篇文章 0 订阅

算法(algorithms)基础之:插入排序

转自:算法(algorithms)基础之:插入排序 — 没那么简单的博客

插入排序,对于少量的元素的数据,它是一个有效的算法。它的工作方式就像许多人排序一副扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右往左将它与已在手中的每张牌进行比较,拿在左手上的牌总是排序好的。如图:

insert_sort_1.png

  1. 假定数组A[5, 2, 4, 6, 1, 3]是需要排序的数据, 长度为6,用php实现如下:
<?php
<?php
/**
 * 插入排序[正序]
 * author: nsimple
 * date: 2016/11/16
 * link: http://nsimple.top
 */
$arr  = [5, 2, 4, 6, 1, 3];
$len  = count($arr);
$step = 0;
for ($i = 1; $i < $len; $i++) {
    $key = $arr[$i];
    $j   = $i - 1;
    while ($j >= 0 && $arr[$j] > $key) {
        $arr[$j + 1] = $arr[$j];
        $j--;
    }
    $arr[$j+1] = $key;
    process($step, $arr);
}
//记录排序步骤
function process(&$step, $arr = array())
{
    echo '<pre>';
    $step++;
    echo '第' . $step . '步排序:';
    print_r($arr);
    echo '</pre>';
}
  1. 执行结果如下:
第1步排序:Array
(
    [0] => 5
    [1] => 2
    [2] => 4
    [3] => 6
    [4] => 1
    [5] => 3
)
第2步排序:Array
(
    [0] => 5
    [1] => 4
    [2] => 2
    [3] => 6
    [4] => 1
    [5] => 3
)
第3步排序:Array
(
    [0] => 6
    [1] => 5
    [2] => 4
    [3] => 2
    [4] => 1
    [5] => 3
)
第4步排序:Array
(
    [0] => 6
    [1] => 5
    [2] => 4
    [3] => 2
    [4] => 1
    [5] => 3
)
第5步排序:Array
(
    [0] => 6
    [1] => 5
    [2] => 4
    [3] => 3
    [4] => 2
    [5] => 1
)
  1. 算法思路:
  2. 开始把数组中第2个元素作为参看值A[i], 并依次把后续的元素作为下一次遍历的参考值;
for($i = 1; $i < $len; $i++) {
    $key = $arr[$i];
    ...
 2. 从参考值前一个元素A[j]开始,然后先把A[j]与参考值比较,如果大于参考值,则把A[j+1]的值变成A[j], 依次类推,直到找到最后一个比参考值大的元素A[j+1]。其中j依次递减,直到比较完左侧第一个元素;
while ($j >= 0 && $arr[$j] > $key) {
    $arr[$j + 1] = $arr[$j];
    $j--;
    ...
}
3. 当第1次参考值比较完之后,需要把参考值插入到最后一个比参考值大的元素A[j+1]的位置上:
$arr[$j + 1] = $key;
  1. 这样左侧的元素就依次排好了~
  2. 用Go实现如下:
/*
 插入排序[正序]
 author: nsimple
 date:2016年11月17日17:39:29
 link: http://nsimple.top
*/
package main

import (
    "fmt"
)

/*追踪排序步骤*/
func showStep(args []int, step *int) {
    *step++
    fmt.Printf("第%d步排序结果:%v\n", *step, args)
}

/*插入排序[asc正序]*/
func insertSort(args ...int) {
    step := 0
    p := &step
    for i := 1; i < len(args); i++ {
        key := args[i]
        j := i - 1
        for ; j >= 0 && args[j] > key; j-- {
            args[j+1] = args[j]
        }
        args[j+1] = key
        showStep(args, p)
    }
}

func main() {
    arr := []int{5, 2, 4, 6, 1, 3}
    insertSort(arr...)
}

执行结果:

D:/Go/bin/go.exe build -i [D:/Go_Workspace/algorithms]
Success: process exited with code 0.
D:/Go_Workspace/algorithms/algorithms.exe  [D:/Go_Workspace/algorithms]
第1步排序结果:[2 5 4 6 1 3]
第2步排序结果:[2 4 5 6 1 3]
第3步排序结果:[2 4 5 6 1 3]
第4步排序结果:[1 2 4 5 6 3]
第5步排序结果:[1 2 3 4 5 6]
Success: process exited with code 0.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值