我正在为我的算法课做一个家庭作业问题,我对这个特定算法的工作原理感到困惑。我已经在网上找到了答案,所以我不是在寻找答案,只是帮助我们逐步完成代码。从我到目前为止所知,该算法接受一个未指定长度的数组并通过多次迭代,通过比较单个元素与数组中较小元素来对数字进行排序。在迭代结束时,它为每个元素分配一个位置索引,该索引指定元素应该以非递减顺序排列的顺序。但我无法弄清楚第一个循环完成后第二个for-do循环如何从迭代开始?非常感谢任何帮助
问题:考虑排序问题的算法,通过计数对每个数组进行排序 它的元素,较小元素的数量,然后使用此信息来放置 元素在排序数组中的适当位置。对以下数字列表进行排序,(60,35,81,98,14,47):
Algorithm ComparisonCountingSort(A[0..n − 1], S[0..n − 1])
//Sorts an array by comparison counting
//Input: Array A[0..n − 1] of orderable values
//Output: Array S[0..n − 1] of A’s elements sorted in nondecreasing order
for i ← 0 to n − 1 do
Count[i] ← 0
for i ← 0 to n − 2 do
for j ← i + 1 to n − 1 do
if A[i] < A[j]
Count[j] ← Count[j] + 1
else
Count[i] ← Count[i] + 1
for i ← 0 to n − 1 do
S[Count[i]] ← A[i]
return S
答案 0 :(得分:1)
这种排序算法的关键在于,如果数组中的数字x
在数组中具有较小的n
个元素,那么在排序数组中它应该是{{ 1}}'元素(在零索引数组中)。
那么算法想要做的是检查每个元素有多少其他元素更小。但是你最后检查每对两次是不必要的。第二个循环以这样的方式构建,即每对都只进行一次比较。
对于长度n
为4的情况,第二个循环,即for for循环可以如下可视化:
N
这里1st outer loop | i -> [0]
| j -> [1] [2] [3]
2nd outer loop | i -> [1]
| j -> [2] [3]
3rd outer loop | i -> [2]
| j -> [3]
和i
是你的循环迭代器,括号之间的值是它们所采用的索引的值。现在你可以清楚地看到,通过这种结构,每一对都进行了一次比较
答案 1 :(得分:0)
感谢您提供的任何帮助,但我在工作了一段时间后能够弄明白。在外行人的术语中,你从第一列开始,它是当前的i,并将它与它后面的每一列(比较中的j)进行比较,如果i大于j,那么我得到1。如果j更高,j得到1.在第一行由全零组成后,第二行被迭代。使用60作为i,你将它与35比作当前的j,因为60大于35,60得到1(如果你愿意的话,计数标记)。然后你比较60到81,因为那将成为新的j。由于81高于60,因此81得到了标记。这将一直持续到行的其余部分结束。在下一次迭代中,下一列成为新的i,以下将成为一个接一个的新j。冲洗并重复,直到完成所有列和行,并为每个元素提供新的索引值,然后按顺序放置。