主题 7 · 算法设计与问题解决
查找、排序与标准方法
逐步讲解线性查找、冒泡排序、求和、计数,以及求最大值、最小值和平均值。
第 3 课,共 5 课大纲 7.4更新于 2026年10月31日
线性查找
线性查找从第一项到最后一项依次检查列表中的每一项,直到找到目标或到达末尾。列表不需要事先排好序。
线性查找 23可交互
114
28
331
423
55
617
742
要查找 23。从第 1 项开始。
步骤 1 / 5
伪代码
DECLARE Numbers : ARRAY[1:7] OF INTEGER
DECLARE Index : INTEGER
DECLARE Target : INTEGER
DECLARE Found : BOOLEAN
FOR Index <- 1 TO 7
INPUT Numbers[Index]
NEXT Index
INPUT Target
Found <- FALSE
Index <- 1
WHILE Index <= 7 AND NOT Found DO
IF Numbers[Index] = Target
THEN
Found <- TRUE
ELSE
Index <- Index + 1
ENDIF
ENDWHILE
IF Found
THEN
OUTPUT "Found at position ", Index
ELSE
OUTPUT "Not found"
ENDIF冒泡排序
冒泡排序遍历列表,比较每一对相邻的数据,如果顺序不对就交换。每一轮结束后,未排序部分中最大的数就“冒泡”到了末尾。当某一轮没有发生交换时,排序结束。
按下“播放”,观察被比较的橙色一对。已经到达最终位置的数据会被填充高亮。
冒泡排序可交互
51
12
43
24
85
36
轮次 0比较次数 0交换次数 0
按“下一步”比较前两个数据项。
步骤 1 / 19
伪代码
DECLARE Scores : ARRAY[1:6] OF INTEGER
DECLARE Top : INTEGER
DECLARE Index : INTEGER
DECLARE Temp : INTEGER
DECLARE Swap : BOOLEAN
FOR Index <- 1 TO 6
INPUT Scores[Index]
NEXT Index
Top <- 6
REPEAT
Swap <- FALSE
FOR Index <- 1 TO Top - 1
IF Scores[Index] > Scores[Index + 1]
THEN
Temp <- Scores[Index]
Scores[Index] <- Scores[Index + 1]
Scores[Index + 1] <- Temp
Swap <- TRUE
ENDIF
NEXT Index
Top <- Top - 1
UNTIL NOT Swap OR Top = 1考试提示: 交换需要一个临时变量。没有 Temp,第一次赋值就会覆盖掉其中一个值。
求和与计数
求和维护一个累计总数:从 0 开始,逐个加上每个值。计数在某件事发生时加 1。两个变量都必须在循环前设为 0。
伪代码
DECLARE Mark : INTEGER
DECLARE Total : INTEGER
DECLARE PassCount : INTEGER
DECLARE Student : INTEGER
Total <- 0
PassCount <- 0
FOR Student <- 1 TO 30
INPUT Mark
Total <- Total + Mark
IF Mark >= 50
THEN
PassCount <- PassCount + 1
ENDIF
NEXT Student
OUTPUT "Total: ", Total
OUTPUT "Passed: ", PassCount最大值、最小值与平均值
求最大值时,记住目前见过的最大值,遇到更大的就替换它。最小值同理,只是换成更小的值。两者都从第一个值开始(或从一个超出可能范围的值开始)。
平均值等于总和除以数据的个数。
伪代码
DECLARE Temps : ARRAY[1:7] OF REAL
DECLARE Day : INTEGER
DECLARE Highest : REAL
DECLARE Lowest : REAL
DECLARE Total : REAL
FOR Day <- 1 TO 7
INPUT Temps[Day]
NEXT Day
Highest <- Temps[1]
Lowest <- Temps[1]
Total <- 0
FOR Day <- 1 TO 7
IF Temps[Day] > Highest
THEN
Highest <- Temps[Day]
ENDIF
IF Temps[Day] < Lowest
THEN
Lowest <- Temps[Day]
ENDIF
Total <- Total + Temps[Day]
NEXT Day
OUTPUT "Highest: ", Highest
OUTPUT "Lowest: ", Lowest
OUTPUT "Average: ", Total / 7关键术语
- 线性查找
- 依次检查每一项,直到找到目标或列表结束。
- 冒泡排序
- 反复比较并交换相邻数据,直到不再需要交换。
- 求和
- 把每个值加到累计总数上。
- 计数
- 每当某件事发生时给计数器加 1。
自我检测
在 50 项的列表上,线性查找最多比较几次?查看答案
50 次,当目标在最后或不在列表中时。
冒泡排序为什么使用 Swap 标志?查看答案
如果一整轮都没有交换,列表已经有序,算法就可以提前结束。
为什么必须在循环前把 Total 设为 0?查看答案
否则它会从一个未知的值开始,总和就会出错。