我正在开发的应用程序遇到以下问题:
我得到了两个列表:
list1 = {Z,K,A,B,A,C}
list2 = {A,A,B,C,K,Z}
list2
是list1
的排序版本。
我的目标是仅通过交换list1
中的元素来对list1
进行排序。因此,例如,我不能遍历list2
并仅将i
中的每个元素list1
分配给j
中的每个元素list2
使用list2
作为资源,我需要在可能的最小交换数量中对list1
进行排序。
是否有专门用于此目的的算法集?我还没有听说过这样的事情。
答案 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
中的相同希望这可以为您提供帮助。