给定一个输入数组,输出用于对数组进行排序的最小交换数

时间:2015-12-28 08:01:05

标签: arrays algorithm

给定一个输入数组我想计算对数组进行排序的最小交换次数。 我认为它等于反转计数,但它没有如下所示:

array [6,4,3]

输出:1,只需将3与3交换。但反转实际上是3。

因此,给定一个输入数组是一种有效的算法来确定交换的最小数量。我知道选择排序具有最小数量的交换,但我也知道它没有效率。

1 个答案:

答案 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