给定一个输入数组我想计算对数组进行排序的最小交换次数。 我认为它等于反转计数,但它没有如下所示:
array [6,4,3]
输出:1,只需将3与3交换。但反转实际上是3。
因此,给定一个输入数组是一种有效的算法来确定交换的最小数量。我知道选择排序具有最小数量的交换,但我也知道它没有效率。
答案 0 :(得分:2)
您可以使用此方法:
说这是你的输入数组:[4 6 1 8 2 7]
然后,在排序数组中,元素的位置将分别为:3 4 1 6 2 5
创建一个访问数组:[0 0 0 0 0 0]
从位置数组中的第1个索引开始,将其标记为已访问,跳转到它所代表的位置,直到visit[]
中的访问值设置为止。
然后,一个周期完成后,选择未设置visit
值的下一个元素。
对于k
元素的循环,请将k-1
添加到交换计数器。
本例中的步骤将是:
visiting index in position[] visit[]
position[1] = 3 [1 0 0 0 0 0]
position[3] = 1 [1 0 1 0 0 0]
现在,形成了一个循环。由于此循环有2个元素,因此将交换计数器加1。现在我们从索引2开始。
position[2] = 4 [1 1 1 0 0 0]
position[4] = 6 [1 1 1 1 0 0]
position[6] = 5 [1 1 1 1 0 1]
position[5] = 2 [1 1 1 1 1 1]
自设置visit[2]
以来,形成循环。这个循环有4个元素,因此,将3添加到交换计数器。
查看visit
中的下一个索引是否仍未设置。 (没有)。停在这里。
所以,你的答案是1 + 3 = 4