跳到正文

查找与排序算法

標準约 28 分钟5 个术语过去问 4 题

本单元目标

  • 能从数据须满足的排列前提和比较次数的增长方式,区分线性查找法与二分查找法。
  • 能用少量数据,逐步跟踪选择排序和冒泡排序在排序过程中数据排列的变化。
  • 能说明快速排序如何用基准值把数据分组,并反复执行同一步骤完成排序。
术语总表(5 个)
术语一句话类别每次的操作比较次数的大致规模
線形探索法从开头起逐个与目标值比较查找与下一个数据比较与数据个数成正比
2分探索法在按升序或降序排好的数据中,每次把范围缩小一半查找与范围中间的值比较,舍去一侧数据个数翻倍也只多 1 次左右
選択ソート从剩余范围中选出最小值,移到一端排序找完最小值后,必要时交换 1 次与数据个数的平方成正比
バブルソート比较相邻的两个值,顺序相反就交换排序相邻两值比较后当场交换与数据个数的平方成正比
クイックソート按基准值分成较小组和较大组,再在各组内重复排序分成比基准值小的组和大的组平均比“平方型”方法少

术语

線形探索法线性查找法

在术语表中打开 線形探索法

线性查找法(線形探索法)是从数据开头起依次 逐个 与目标值比较,一旦相同就结束的查找方法。

  1. 与第 1 个的 4 比较
  2. 与第 2 个的 9 比较
  3. 第 3 个的 7 相同,结束

第 3 次比较时相同,剩下的 2 不再检查,直接结束。

3 / 3

数据即使没有排序,也可以直接使用。比较次数取决于目标值所在的位置,若它在末尾或根本不存在,就要与全部数据逐一比较。平均下来,大约需要比较数据个数一半的次数。

类比就像在书脊排列杂乱的书架上找一本书,只能从最左边开始一本一本地看。

记法“线性”就是一条线:像沿着线描一样,从一端朝一个方向推进。

考点

  • 常考线性查找法(線形探索法)的比较次数与数据个数成正比增长。数据个数翻倍,最坏情况下的比较次数也翻倍。

该术语的过去问 1 题 線形探索法

2分探索法二分查找法

在术语表中打开 2分探索法

二分查找法(2分探索法)用于按从小到大(升序)或从大到小(降序)排好序的数据,每次与查找范围 中间 的值比较,把范围缩小为目标值所在的那一半。

  1. 范围为第 1〜8 个
  2. 与中间第 4 个的 13 比较
  3. 范围缩小为第 5〜8 个
  4. 中间第 6 个的 21 相同

新范围中间的第 6 个正是 21,比较 2 次就找到了。

4 / 4

以升序为例,目标值比中间值小就只保留前半部分,比中间值大就只保留后半部分,如此反复,直到找到或范围为空。每比较一次,候选就减少约一半,所以数据个数翻倍,比较次数也只增加 1 次左右。不过比较次数也会随目标值的位置而变,若目标值靠近开头,线性查找法有时反而用更少的次数就能找到。

类比就像在一沓按号码顺序叠好的挂号单里抽出中间那张,判断要找的号码在前还是在后,再到剩下的一半里看中间那张。

记法“二分”就是一分为二。英文 binary search 中的 binary 也是“二”的意思。

考点

  • 常考二分查找法(2分探索法)反复与剩余范围中间的元素比较,每比较一次就把候选减少约一半。
  • 易混以数据已按升序(昇順)或降序(降順)排好为前提的是二分查找法(2分探索法),而线性查找法(線形探索法)不论数据如何排列都能使用。

该术语的过去问 1 题 2分探索法

「线性查找法」与「二分查找法」的区别

比较点线性查找法二分查找法
关键数据的排列不限排列顺序须已按升序或降序排好
开始比较的位置开头查找范围的中间
数据个数翻倍时最坏比较次数也翻倍比较次数增加 1 次左右

选择排序(選択ソート)是反复从尚未排好的范围中选出 最小值(或最大值),并与该范围一端的值交换的排序方法。

  1. 开始 6 2 9 4
  2. 第 1 次 2 6 9 4
  3. 第 2 次 2 4 9 6
  4. 第 3 次 2 4 6 9(剩下的 1 个也确定)

第 3 次把剩余 9 6 中较小的 6 与第 3 个的 9 交换,第 3 个确定;最后剩下的 9 不用比较,就落在第 4 个。

4 / 4

排序是把数据按值的大小顺序重新排列的处理。把未排序范围检查一遍、确定一端 1 个位置的值,这一轮称为 1 趟,每过 1 趟范围就缩小 1 个。比较次数大约与数据个数的平方成正比,因此数据多时很费时间。

类比就像整理手里的扑克牌:从还没理好的牌里找出最小的一张,放到已理好那几张的右边,如此反复。

记法英文 selection 意为“挑选”:就像选拔代表,先把所有人比一遍,再选出 1 个。

考点

  • 常考选择排序(選択ソート)每 1 趟确定一端的 1 个位置,最后剩下的 1 个不用比较位置就已确定。趟数在把剩下的 1 个也算作 1 趟的步骤中等于数据个数,不算的步骤中则等于数据个数 − 1。
  • 常考在把最小值移到前面的选择排序中,完成第 k 次选择与交换时,开头的 k 个值已按从小到大的顺序确定。

该术语的过去问 2 题 選択ソート

バブルソート冒泡排序

在术语表中打开 バブルソート

冒泡排序(バブルソート)是比较 相邻的两个 值、顺序相反就交换,并从一端到另一端反复进行的排序方法。

  1. 开始 6 2 9 4
  2. 交换 6 和 2 → 2 6 9 4
  3. 6 和 9 不动 → 2 6 9 4
  4. 交换 9 和 4 → 2 6 4 9

交换第 3 个和第 4 个后,最大的 9 被送到末尾,第 4 个确定。

4 / 4

按升序排列时,每走完 1 趟,最大的值就被送到末尾并确定下来。下一趟在除去已确定末尾的范围内做同样的操作,如果某 1 趟中一次交换也没发生,排序就已完成。比较次数与选择排序相同,大约与数据个数的平方成正比。

类比就像排成一列的人只和身旁的人比身高,个子高的往右挪一位,一直比到队尾。

记法bubble 是“气泡”:大的值像气泡一样,一个个浮到末端。

考点

  • 常考升序的冒泡排序(バブルソート)在相邻两个值中左边较大时交换。每 1 趟确定末尾的值,所以下一趟要比较的范围缩短 1 个。
  • 易混选择排序(選択ソート)在 1 趟中找完最小值后最多交换 1 次,而冒泡排序(バブルソート)每比较一次,遇到顺序相反的相邻值就当场交换。

该术语的过去问 1 题 バブルソート

「选择排序」与「冒泡排序」的区别

比较点选择排序冒泡排序
关键每比较一次之后若值更小,就把它记为新的最小值候选(不交换)顺序相反就当场交换相邻两值
每趟的交换次数最多 1 次与比较时顺序相反的相邻对数相同
升序基本形式下每趟确定的值选出的最小值(开头一侧)最大值(末尾一侧)

クイックソート快速排序

在术语表中打开 クイックソート

快速排序(クイックソート)是先选定 1 个 基准值(pivot),把数据分成比它小的组和比它大的组,再对各组重复同样步骤的排序方法。

  • 5 8 2 7 1 4(基准值 5)
    • 较小组 2 1 4(基准值 2)
      • 1
      • 2
      • 4
    • 5
    • 较大组 8 7(基准值 8)
      • 7
      • 8

各组也按基准值再分,只剩 1 个的值位置随即确定。从左往右读就是 1 2 4 5 7 8。

3 / 3

组内元素只剩 1 个或没有时就不必再分,把各组按顺序排起来,整体就排好了。像这样把同一步骤套用到更小部分上的做法称为递归。平均比较次数比“平方型”方法少,但基准值选得不好时,会接近数据个数的平方。

类比就像把一堆文件按某个基准日期分成之前和之后两堆,再把每一堆照同样方法继续分下去。

记法quick 在英文中是“快”的意思。

要点

  • 查找(探索)是在数据中找出目标值所在位置的处理,排序(整列)是按值的大小顺序重新排列的处理。
  • 选择排序和冒泡排序都是每 1 趟从一端确定 1 个值的位置,比较次数大约与数据个数的平方成正比。
  • 快速排序按基准值把数据分成较小组和较大组,并对各组重复同样的步骤。平均来看,它的比较次数比“平方型”方法少。

确认题

从本单元的过去问中选 4 题

开始做确认题

查看这个领域的全部过去问