algorithm - 从源排列到目的地的最小移动数

标签 algorithm permutation

给定 [1...N] 的排列“S”和一个空闲点,因此序列的总长度为 N+1。

只需一步,您就可以将排列中的任何元素与空闲点交换。

您需要找到从“S”到排序的排列序列的最小步数。

最佳答案

如果我理解正确,huck_cussler 的解决方案需要前瞻性搜索应该位于空白处的数字位置。

这里有一个替代解决方案,它不需要前瞻,最多使用 2N 次交换。

static void swapperSort(int[] arr)
{
    int n = arr.length-1;
    for(int i=0, pos=0, space=n; i<n-1;)
    {
        System.out.print(pos + " " + space + " " + Arrays.toString(arr));
        if(arr[pos] == pos+1)
        {
            pos = ++i;
        }
        else 
        {
            System.out.print(" SWAP");
            int idx = arr[pos]-1;
            swap(arr, idx, space); 
            swap(arr, pos, idx);

            int tmp = space;
            space = pos;
            pos = tmp;
        }
        System.out.println();
    }
    System.out.println(Arrays.toString(arr));
}

这是 DAle 测试用例的输出:

0 6 [2, 1, 4, 3, 6, 5, 0] SWAP
6 0 [0, 2, 4, 3, 6, 5, 1] SWAP
0 6 [1, 2, 4, 3, 6, 5, 0]
1 6 [1, 2, 4, 3, 6, 5, 0]
2 6 [1, 2, 4, 3, 6, 5, 0] SWAP
6 2 [1, 2, 0, 4, 6, 5, 3] SWAP
2 6 [1, 2, 3, 4, 6, 5, 0]
3 6 [1, 2, 3, 4, 6, 5, 0]
4 6 [1, 2, 3, 4, 6, 5, 0] SWAP
6 4 [1, 2, 3, 4, 0, 6, 5] SWAP
4 6 [1, 2, 3, 4, 5, 6, 0]
[1, 2, 3, 4, 5, 6, 0]

关于algorithm - 从源排列到目的地的最小移动数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45286653/

相关文章:

php - 使用 SQL 根据给定的条件进行计算

堆算法的 C# 实现不起作用

python - 生成所有可能的有序字符串排列

java - 使用红黑树的字典 - 删除错误

algorithm - 第二类斯特林数的递归关系

python - pandas python的算法思路

java - 从数字列表中找到所有不同总和的算法

Java将一个Int数组的所有排列放入另一个数组中而不重复

javascript - 如何确定这个算法的时间和空间复杂度?

algorithm - 用于 k-best 的 Suurballe 算法