我是一名自学成才的计算机科学专业的学生。现在我正在阅读 CLRS 并且我做了 2.2-2 练习,它是关于选择排序的。
第一个数组下标为 1。
我写的伪代码是:
FOR i=1 to A.length - 1
FOR j=i+1 to A.length
IF A[j] < A[i]
new_index=j
IF new_index > i
tmp = A[i]
A[i] = A[new_index]
A[new_index] = A[i]
我的理由是:
第一个循环测试执行 n 次 (1, 2, 3 ... n)。当 i 变为 n 时,循环停止。所以第 5 行被执行 (n-1) 次,依此类推。
然后我认为第二个循环测试执行了 (n^2 + n - 2)/2 次。当初始 j = 2 时,假设:2、3、4、5 ... (n + 1),循环测试执行 n 次,当 j = 3 时,循环测试执行 (n - 1) 次,依此类推上。因此,当 j = n 时,循环测试执行 2 次。
因此,执行第二个循环测试: 2 + 3 + 4 + 5 + ... + n = [(n-1)*(n+2)] / 2 = (n^2 + n - 2) / 2.所以执行第二个循环的内部if:1 + 2 + 3 + 4 + ... + (n-1) = [(n-1)*n] / 2。
在写这篇文章之前,我读了很多假设的解决方案,但没有一个能和我的一样。所以我想知道我的推理是否错误。
我希望我以良好的形式写下了所有细节。