当我对数组 B 进行排序时,数组 A 的内容发生了变化,这应该是 A 的副本

Contents of array A changes when I sort array B, which is supposed to be a duplicate of A

我有一个 10x 循环来对数字数组 B(原始数组的副本 A)进行排序并记录 运行 时间,因为数组在循环结束我创建了一个重复数组 B 进行更改,并使用 A 将其设置为新循环开始时的原始状态。

当它排序 B 时,A 也会自动排序,即使我只发送 B 也是如此。 为什么会发生这种情况以及如何改变它?

循环:

for (i in 1..10) {
        val B = A
        val time = measureTimeMillis {
                val sorting = Insertion(B); sorting.sor
        }
        println(""+ cycle++ + "\t" + time)
}

排序:

class Insertion(var B: IntArray) {
    fun sort(): Unit {
        for( j in 1 until B.size){
            var key = B[j]
            var i = j-1
            while( i > -1 && B[i] > key){
                B[i+1] = B[i]
                i= i - 1
            }
            B[i+1] = key
        }
    }
}

发生这种情况是因为您使用了相同的数组。在 val B = A B 是对数组 A 的引用之后,没有创建副本。要创建副本,您需要调用 val B = A.copyOf().

在循环开始时,您有一个 IntArray 对象和一个引用它的变量:

    A ──→ IntArray

然后创建第二个变量,它引用同一个 IntArray 对象。

    A
      >─→ IntArray
    B 

希望这说明了为什么通过引用 B 所做的更改也将通过引用 A 可见。

如果您希望 B 引用 不同的 IntArray,您必须复制它,例如:

val B = A.copyOf()

或:

val B = A.clone()

或:

val B = IntArray(a.size){ A[it] }

或其他各种方式。 (copyOf() 通常是最好的。)

(最后请注意,Kotlin 约定变量、方法和属性以小写字母开头,只有 类 和类型参数以大写字母开头。)