• 插入排序


    直接插入排序原理:

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

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

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

    例:
      

      开头的红色数字为哨兵,即待插入值。假定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 排序

      使用在小规模数据比较

  • 相关阅读:
    POJ 1015 Jury Compromise【DP】
    POJ 1661 Help Jimmy【DP】
    HDU 1074 Doing Homework【状态压缩DP】
    HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
    占坑补题。。最近占的坑有点多。。。
    Codeforces 659F Polycarp and Hay【BFS】
    Codeforces 659E New Reform【DFS】
    Codeforces 659D Bicycle Race【计算几何】
    廖大python实战项目第四天
    廖大python实战项目第三天
  • 原文地址:https://www.cnblogs.com/zyybky/p/12831241.html
Copyright © 2020-2023  润新知