zoukankan      html  css  js  c++  java
  • 排序算法总结

    排序小结

    • 直接插入排序

      • 主循环:从第二个元素开始向后执行,判断元素与其前一位的关系;
        • PS:该元素的之前均已被排好序;
      • 若待排元素小于前一位,进入子循环:
        • 记录待排元素为监视哨;
        • 向前循环判断元素与待排元素大小关系,若大于,则元素后移;
          • PS:第一个后移的元素占据待排元素的位子;
        • 若小于,则将待排元素赋值给该元素的后一位;
    • 快速排序

      • 主循环:对输入的表进行第一次划分,以轴为中心,比轴小的在轴左边,大的在右边;

        • ps:无所谓顺序,只分左右,到最后自然成序;
        • 对左右序列递归调用该函数;
      • 划分的算法思想

        • 以最左边元素为轴,记录监视哨,记录为low;
        • 先从右向左扫描,直到找到比轴小的,记录为high,并将其赋值给low;
        • 再从low位置到右扫描,直到找到比轴大的,赋值给high;
          • high已赋值出去,故可随意被赋值;
        • 重新从high位置向左扫描,重复上述步骤;
    • 堆排序

      • 大顶堆
        • 最大元素在根节点;
        • 父亲结点一定大于其左右孩子;
      • 基本思想
        • 通过维护堆的性质,筛选出最大元素并置于根节点;
        • 将根节点(即最大元素)与最尾部元素互换,作为序列最后一个元素;
        • 对除根节点之外的元素继续建立大顶堆,即重新筛出新堆中最大的,重复上述步骤;
      • 维护堆的性质的算法思想
        • 调用该函数时,除堆顶外均符合大顶堆的性质;
        • 定义关键字s作为存放堆顶元素位置的标志,是循环中每一次比较时的父亲节点;
        • 记录堆顶元素;
        • 自顶向下,先比较根节点的左右孩子大小;
        • 比较堆顶元素与较大孩子的大小关系:
          • 若小于,将较大孩子赋值给根节点;
          • 若大于,则循环结束,堆顶元素有资格做爸爸,该父亲节点位置即放置堆顶元素的位置;
      • 建堆算法思想
        • 自底向上,从第一个非叶子节点开始,循环调用维护性质函数;
          • 即对以父亲节点为根节点的一个堆维护堆的性质;
        • 对上一个结点继续重复上述步骤;
    • 归并排序

      • 对数组不断二分,直至待排序列长度为1;
      • 回退,对序列进行归并:
        • 两个序列,先对第一个元素进行比较,将大的记入数组,较大元素所在序列指针右移;
        • 重复上述步骤;
      • 递归进行,直至回退完全;
    • 计数排序

      • 先统计每个元素的个数,即在数组C[i]中存值等于 i 的元素个数;
      • 令C[i]=C[i]+C[i-1],即在C[i]中存值小于等于 i 的元素个数;
      • 查表填入,将元素填入数组值作下标的位置,并将数组值-1,即下次再填就填在前一个;
    • 基数排序

      • 从最低位开始,对数字进行逐位排序;
        • 即对每个元素的个位排序,然后十位,以此类推;

    排序算法小结

    • 两种数据结构
      • 线性表
      • 二叉树
    • 六种排序算法
      • 插入排序
      • 快速排序
      • 堆排序
      • 归并排序
      • 计数排序
      • 基数排序
    • 一种算法设计策略
      • 分治算法
  • 相关阅读:
    因数最多的数
    剪枝策略
    计蒜客 引爆炸弹(DFS、并查集)
    计蒜客 方程的解数(DFS)
    计蒜客 数独(DFS)
    计蒜客 王子救公主(DFS)
    kuangbin专题 专题九 连通图 POJ 3694 Network
    2019 ICPC Asia Nanjing Regional K. Triangle
    HDU 1875 畅通工程再续
    还是畅通工程 HDU
  • 原文地址:https://www.cnblogs.com/fzlzc/p/11084834.html
Copyright © 2011-2022 走看看