zoukankan      html  css  js  c++  java
  • 插入排序

    直接插入排序原理:

      在未排序序列中,构建一个子排序序列, 直至全部数据排序完成;

      将待排序的数,插入到已经排序的序列中合适的位置;

      增加一个哨兵,放入待比较值,让它和后面已经排好序的序列比较,找到合适的插入点。

    例:
      

      开头的红色数字为哨兵,即待插入值。假定1已经有序,从第二个数字9开始排序:

        第一趟,哨兵9,1和哨兵比较,1小,本轮比较结束;

        第二趟,哨兵8,9和哨兵比较,哨兵9大右移,1和哨兵比较,1小, 哨兵插入本轮比较结束;

        以此类推,直至把最后一个数字放到哨兵并比较、插入完成。

      空间复杂度:O(1)、时间复杂度:O(n^2)

    实现:

    nums = [4, 3, 5, 2]
    nums = [None] + nums
    print(nums)
    length = len(nums)
    ​
    for i in range(2, length):
        nums[0] = nums[i]
        j = i-1
        if nums[j] > nums[0]:        # 判断是否需要挪动
            while nums[j] > nums[0]:
                nums[j+1] = nums[j]
                j -= 1
            nums[j+1] = nums[0]
    print(nums[1:])
    

      最好情况,正好是升序排列,比较迭代 n-1 次

      最差情况,正好是降序排列,比较迭代 1,2,...,n-1 即 n(n-1)/2,数据移动非常多

      使用两层嵌套循环,时间复杂度 O(n^2)

    优化:如果比较操作耗时大的话,可以采用二分查找来提高效率,即二分查找插入排序

    稳定排序算法:

      如果待排序序列 R 中两元素相等,即 Ri 等于 Rj,且 i < j,那么排序后这个先后顺序不变,这种排序算法就称为稳定排序

      冒泡排序(选择排序)、插入排序算法是稳定排序,考虑 1、1、2 排序

      使用在小规模数据比较

  • 相关阅读:
    12_springmvc拦截器
    11_springmvc之RESTful支持
    10_springmvc JSON数据交互
    09_springmvc图片上传
    09_springmvc异常处理
    08_springmvc数据回显和@ModelAttribute注解详解
    Eclipse-----解决调试源码不进入断点问题
    JavaScript-----截取字符串的常用方法
    排序(Sort)-----冒泡排序
    SpringMVC探究-----常用获取传递参数的方法
  • 原文地址:https://www.cnblogs.com/zyybky/p/12831241.html
Copyright © 2011-2022 走看看