我很好奇是否有(肯定但我不知道该寻找什么)某种智能排序算法。
智能排序算法是什么意思?让我们考虑一个例子:
我在表格中排列了5个数字:
1, 2, 3, 4, 5
然后我换了第2和第4,所以我有:
1, 4, 3, 2, 5
作为第二步,我交换第5和第2,所以最终结果是:
1, 5, 3, 2, 4
我对算法的期望是将最终设置作为输入(1,5,3,2,4),因此我想得到的信息是我应该交换第2和第5项然后第2和第2项获得第4列表。
我正在考虑使用排序网络:我可以为特定大小的数据生成所有必需的比较和交换指令,然后返回那些为输入数据完成的交换,但是可能还有其他一些方法吗? / p>
我应该寻找什么?
答案 0 :(得分:2)
查找最小交换次数对于排序通常并不重要(交换可以在指针上完成),但它本身就是一个众所周知的问题。
看看这个问题: Counting the adjacent swaps required to convert one permutation into another
或者将您的研究指向编辑距离。
答案 1 :(得分:1)
我认为这里的问题是数据的实际交换非常昂贵,但比较相对便宜。
我首先使用常规排序算法来找出数组中每个元素的位置。有很多算法可以做到这一点,例如快速排序或只是冒泡或插入。
现在我们知道每个元素应该去哪里,从现在开始我们可以找到最佳的交换序列,以便将原始数据输入到排序位置。
伪代码示例:
compare(proxy1, proxy2)
return compare(proxy1.data, proxy2.data)
smartSort(unsorted)
swaps = []
count = size(unsorted)
// create a proxy for all elements
proxiesOrig = [ new proxy(data) | for unsorted as data ]
// and make a copy which we are going to sort
proxiesSort = shallowCopy(proxiesOrig)
sort(proxiesOrig) // Do a regular sort here, using the compare function above
// now note the location of each target
// because we made a shallow copy, the location will also be marked in the
// proxiesOrig list
for i = 1 .. count
proxiesSort[i].location = i
// Now the proxiesOrig is the unsorted list
// with location information to where everything needs to go
for i = 1 .. count
while (proxiesOrig[i].location <> i)
// swap the proxy on location i with the one to where i needs to go
swap(proxiesOrig, i, proxiesOrig[i].location)
// and record it
swaps.add(i, proxiesOrig[i].location)
return swaps