这是在delphi中对一维数组进行排序的代码。
由 15 个先前随机输入的元素组成的数组。
请帮助我理解为什么有两个周期。
我对这段代码的理解是这样的:在循环中,我们遍历 arr 数组,将当前元素与下一个元素进行比较,并根据结果执行置换,但是为什么要两个循环呢?
for i:= 1 to 15 do
for j:= 1 to 14 do
if arr[j] > arr[j+1] then
begin
x:= arr[j+1];
arr[j+1]:= arr[j];
arr[j]:= x;
end;
让我们看一个例子:
该算法的一个极端情况是元素以相反的顺序排序,即
arr = (15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)去掉外循环(on
i),执行内循环(onj)1次,得到:arr = (14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 15)那些。最大元素可以立即向右移动到它的位置,但是向左的最小元素只能移动一个位置。
因此,需要一个外循环,因为 向左的最小值必须在整个数组中移动。
有两个注释:
i就足够了N-1,因为这是将元素从一端移动到另一端所需的操作次数。i中,最大的元素都在它们的位置,那么仅对第一个N-i元素执行内部元素就足够了。PS对于简单的排序,您需要将每个元素与每个元素进行比较,即 N*N 比较的顺序。嵌套循环只是给出了这样一个动作数量的顺序。