用于昂贵交换的排序算法?

时间:2018-11-06 14:09:37

标签: algorithm sorting

我正在开发的应用程序遇到以下问题:

我得到了两个列表:

list1 = {Z,K,A,B,A,C}

list2 = {A,A,B,C,K,Z}

list2list1的排序版本。

我的目标是仅通过交换list1中的元素来对list1进行排序。因此,例如,我不能遍历list2并仅将i中的每个元素list1分配给j中的每个元素list2

使用list2作为资源,我需要在可能的最小交换数量中对list1进行排序。

是否有专门用于此目的的算法集?我还没有听说过这样的事情。

1 个答案:

答案 0 :(得分:0)

我用Java编写了这段代码,以进行最小限度的交换, 由于可以保证对第二个列表进行排序,因此我们可以查找其中的每个元素,并从第一个列表中找到其索引,然后在当前索引元素和找到的元素之间进行交换。

更新:我修改了findLastElementIndex,因为它根据列表2检查交换后的元素是否在正确的索引中。

public class Testing {

    private static String[] unorderedList = {"Z", "C", "A", "B", "A", "K"};
    private static String[] orderedList = {"A", "A", "B", "C", "K", "Z"};
    private static int numberOfSwaps;

    public static void main(String[] args) {
        for (int i = 0; i < unorderedList.length; i++) {
            if (!unorderedList[i].equals(orderedList[i])) {
                int index = findElementToSwapIndex(i, orderedList[i]);
                swapElements(unorderedList, i, index);
            }
        }
        System.out.println(numberOfSwaps);
    }

    private static void swapElements(String[] list, int indexOfFirstElement, int IndexOfSecElement) {
        String temp = list[indexOfFirstElement];
        list[indexOfFirstElement] = list[IndexOfSecElement];
        list[IndexOfSecElement] = temp;
        numberOfSwaps++;
    }

    private static int findElementToSwapIndex(int currentIndexOfUnorderedList , String letter) {
        int lastElementToSwapIndex = 0;
        for (int i = 0; i < unorderedList.length; i++) {
            if (unorderedList[i].equals(letter)) {
                lastElementToSwapIndex = i;
            if(unorderedList[currentIndexOfUnorderedList].equals(orderedList[lastElementToSwapIndex])){// check if the swapped element will be in the right place in regard to list 2
                    return lastElementToSwapIndex;
                }
            }
        }
        return lastElementToSwapIndex;
    }
}

此代码的最小交换次数与https://stackoverflow.com/a/40507589/6726632

中的相同

希望这可以为您提供帮助。