我知道至少有这两种方法:
array[i], array[j] = array[j], array[i]
和:
temp = array[i]
array[i] = array[j]
array[j] = temp
并且在我对调用交换函数数十万次的代码的测试中,第二种方法实际上更快。
问题是,我想知道是否有更快的方法。
我考虑过在外部范围中分配temp,这样就不必在每次调用swap时都分配temp,但这没有帮助。
编辑:我正在使用它来实现一个最小堆,该最小堆中有成千上万个元素。
而且,我不能使用numpy。如果python中的数组就像链表一样,使用索引号为键的字典来模拟一个真实的数组会更好吗?
因此,以下内容假设数组是python List
,它在内存中的作用类似于链表(不是通常在'C'中使用的数组)
而且,您不能为变量预分配空间(就像您尝试使用temp
那样),因为Python中的每个变量都只是对内存地址的引用,因此每次执行temp = array[i]
时都会分配temp指向array[i]
的引用(已在内存中,就像在array
中一样。)>
您可以尝试使用list(reversed([array]))
或array[::-1]
反转列表,以较易读的形式为准。
如果您实际上有一个数组(假设此处为numpy
;这更像是'C'数组),则可以这样做
swapped_array = array[:, [1, 0]] # Reads as 'Select all rows (:) of column 1 and then column 0
应该是即时的,因为numpy不会移动内存中的元素,而只是将第1列“分配”到第0列,反之亦然。
在较低级别上,两种交换元素的唯一区别在于:
刚刚看到您在问题中添加了“实现最小堆”。通过将“当前筛选”值保留在一个额外的变量中而不是在列表中,您可以使速度更快一些。