Algorithm 选择排序CLRS-推理的正确性

Algorithm 选择排序CLRS-推理的正确性,algorithm,selection-sort,big-theta,clrs,Algorithm,Selection Sort,Big Theta,Clrs,我是自学计算机科学的学生。 现在我正在阅读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[ne

我是自学计算机科学的学生。 现在我正在阅读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]
对于i=1到A.length-1
对于j=i+1至A长度
如果A[j]i
tmp=A[i]
A[i]=A[new_index]
A[新的指数]=A[i]
我的理由是:
第一个循环测试执行n次(1、2、3…n)。当我变成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

在写这篇文章之前,我读了很多假设解,但没有一个能和我的相等。所以我想知道我的推理是否错误


我希望我把所有细节都写得很好。

伪代码是正确的,您的分析是正确的,但是您的解决方案在推理过程中有一些错误


一些提示 然后我认为第二个循环测试执行了(n^2+n-2)/2次

它被执行n(n-1)/2次。请参阅下面的解决方案

当初始j=2时,它假设:2,3,4,5。。。(n+1),循环测试执行n次

记住代码是:
对于j=i+1到A.length
,因此当内部FOR循环从j=2开始时,它上升到j=A.length,即上升到j=n。换句话说,它重复执行j=2,3,4,…,n,因此总共执行n-1次,而不是n次

因此,执行第二个循环测试: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

假设始终执行第二个循环的if语句体(if条件始终为true),那么它应该执行与第二个循环测试相同的次数。所以我不明白你的道理。至于求和,要找到迭代次数,需要将以下各项相加:

  • j=1:执行(n-1)次
  • j=2:执行(n-2)次
  • j=3:执行(n-3)次
  • j=n:执行1次
所以你需要加起来:(n-1)+(n-2)+(n-3)+…+1=n(n-1)/2


解决方案
  • 内部for循环精确地执行C(n,2)=n(n-1)/2次。循环生成所有对(i,j),使1