我参加了一个叫做算法的基本课程。我们正在研究排序算法;我们给出了以下伪代码作为插入排序算法的示例。不过我认为这是错误的。
item: Set Variable
Variable=MAINDIR
Value=C:\MyApp
end
item: Set Variable
Variable=COMPANY
end
item: Set Variable
Variable=SERIAL
end
item: Read INI Value
Variable=COMPANY
Pathname=%MAINDIR%\MyAppSettings.ini
Section=settings
Item=COMPANY
end
item: Read INI Value
Variable=SERIAL
Pathname=%MAINDIR%\MyAppSettings.ini
Section=settings
Item=SERIALNUMBER
end
item: Custom Dialog Set
Name=My App Settings
item: Dialog
Title=My App Settings
Width=290
Height=238
Font Name=Helv
Font Size=8
item: Static
Rectangle=5 5 105 20
Enabled Color=00000000000000001111111111111111
Create Flags=01010000000000000000000000000000
Text=Company Name
end
item: Editbox
Rectangle=114 7 230 22
Help Context=16711681
Enabled Color=00000000000000001111111111111111
Create Flags=01010000100000010000000000000000
Text=%COMPANY%
end
item: Static
Rectangle=5 25 105 40
Enabled Color=00000000000000001111111111111111
Create Flags=01010000000000000000000000000000
Text=Serial Number
end
item: Editbox
Rectangle=114 26 230 41
Help Context=16711681
Enabled Color=00000000000000001111111111111111
Create Flags=01010000100000010000000000000000
Text=%SERIAL%
end
item: Push Button
Rectangle=182 145 217 160
Enabled Color=00000000000000001111111111111111
Create Flags=01010000000000010000000000000000
Text=&Next
end
end
end
我理解第一行 - 它从2开始,因为第一张卡是"已经订购",因为它是迄今为止唯一的卡。
第二行是错误的吗?怎么可能我们使用j从i到2?当然,这在未来不可能成立。此外,不应该缩小中断吗?所以只有一个标签而不是2?
修改
这是"主要想法"算法。正如你所看到的那样,索引j的范围似乎错了。
EDIT2
所以在这里我尝试写下我脑海中发生的事情,阅读这个伪代码:
假设我有列表For i in {2,..,n}:
For j in {i,..,2}:
If a(j)<a(j-1), swap a(j) and a(j-1)
Else, Break
。我会写(5,3,8,7,2,4,1,6)
来分隔&#34;手&#34;在甲板上,我也会写|
来强调我正在看哪个元素。所以我们走了:
5_
如你所见,从现在开始这将永远发生,因为我们从2开始,因为我们打破它!因此,即使j的整数集增加,我们也不能再进一步2,因为我们只是违反了条件
答案 0 :(得分:3)
如果您做出以下假设,则代码有效:
N
的数组具有索引1..N
for x in {a,...,b}
将通过a, a+1, a+2, ..., b-1, b if a <= b
,但会通过a, a-1, a-2, ..., b+1 b if a >= b
。答案 1 :(得分:2)
第二行不是错误,因为您尝试获取第i个元素(在外部循环上运行)并在其之前插入分区。然后,您必须将此元素与之前的分区进行比较,以使其排序。
这个SO帖子有一个很好的可视化: Insertion Sort vs. Selection Sort