排序小结
-
直接插入排序
- 主循环:从第二个元素开始向后执行,判断元素与其前一位的关系;
- 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,即下次再填就填在前一个;
-
基数排序
- 从最低位开始,对数字进行逐位排序;
- 即对每个元素的个位排序,然后十位,以此类推;
- 从最低位开始,对数字进行逐位排序;
排序算法小结
- 两种数据结构
- 线性表
- 二叉树
- 六种排序算法
- 插入排序
- 快速排序
- 堆排序
- 归并排序
- 计数排序
- 基数排序
- 一种算法设计策略
- 分治算法