【问题标题】:Given an input array, output the minimum number of swaps for sorting the array [duplicate]给定一个输入数组,输出排序数组的最小交换次数[重复]
【发布时间】:2015-12-28 08:01:05
【问题描述】:

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

array [6,4,3]

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

所以给定一个输入数组,是否有一个有效的算法来确定交换的最小数量。我知道选择排序的交换次数最少,但我也知道它效率不高。

【问题讨论】:

  • @RohitRawat 即使该问题的最高答案回答了另一个问题(OP 的意思但没有问的问题),第二个答案实际上回答了这个问题。

标签: arrays algorithm


【解决方案1】:

你可以使用这个方法:

假设这是你的输入数组:[4 6 1 8 2 7]

那么,在有序数组中,元素的位置将分别为:3 4 1 6 2 5

创建访问数组:[0 0 0 0 0 0]

从位置数组的第一个索引开始,标记为已访问,跳转到它所代表的位置,直到设置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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-08
    • 2022-01-05
    • 2023-03-26
    • 2018-07-08
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    相关资源
    最近更新 更多