zoukankan      html  css  js  c++  java
  • 内排序之直接插入排序

    • 我们一般最开始接触的排序就是插入排序,它看上去非常简单,可是如果没有弄清楚他的细节,自己手写一个插入排序,也是会出各种错,甚至就是写不出来,直到看到答案,再恍然大悟,奥,然后下次还是写不出,不用说,本人就经历过几次这样的情景,所以,虽然简单,还是有必要踏踏实实弄清楚这个最基础的算法。

    处理方法

    1. 初始状态:有一个n个元素的数组待排序,迭代指针初始为第二个元素 (下标为1),设该元素为key,key左侧的元素在初始时是有序的,很好理解,因为初始时,key左侧只有一个元素,一个元素是有序的。

    2. 迭代状态:将key插入左侧有序的数组,然后迭代指针右移一位。

    3. 终止状态:迭代指针到了整个数组的最后一位,并将最后一位插入到了左侧对应的位置,排序完成。

    细节处理

    • 我们用最简单的整数排序来做例子
    • c是一个整数数组, 变量i用来标志1到len(c)的数组下标,初始时i = 1, key = c[i] = c[1],变量j用来标志key左侧有序数组的下标,初始时,j = 0,c[j] = c[0]
    • 我们需要用一个双层循环来处理这个排序,外层循环的上下界是1和len(c), 左侧已排序的数组的上下界是0和j
    • python2.x 如下代码:
    c = []
    for i in range(5):
        item = int(raw_input("请输入数值:"))
        c.append(item)
    
    length = len(c)
    for i in range(1, length):
        j = i - 1
        key = c[i]
        while j >= 0 and key < c[j]:
            c[j], c[j + 1] = c[j + 1], c[j]
            j -= 1
    
    print c
    

    外层循环,是由前向后迭代1-len(c),内层循环是由后向前迭代0-j,如果key小于c[j],就交换c[j]和c[j+1],j-=1

    ps

    • 用python实现这个排序,网上有很多教程,在交换c[j]和c[j+1]的时候,引入了一个中间变量,像c语言,两个值交换的时候,需要引入中间变量,但是在python里,可以直接交换,上面这样写比较pythonic。
  • 相关阅读:
    SpringCloud整合过程中jar依赖踩坑经验
    spring-boot-starter-parent的主要作用
    配置Setting.xml文件提高maven更新下载jar包速度
    剑指Offer-编程详解-二维数组中的查找
    Git 拉取Gitee仓库报错:“fatal: unable to access ''": Failed to connect to 127.0.0.1 port 1080: Connection refused”
    SpringBoot整合mybatis——配置mybatis驼峰命名规则自动转换
    SpringBoot 整合 Mybatis + Mysql——XML配置方式
    ES+open-falcon之nginx状态码监控报警自动化
    zabbix告警邮件美化
    基于Jenkins+Gitlab的自动化部署实战
  • 原文地址:https://www.cnblogs.com/becker/p/7902782.html
Copyright © 2011-2022 走看看