排序算法,返回有关要交换的项目的信息

时间:2013-08-31 10:21:43

标签: algorithm sorting

我很好奇是否有(肯定但我不知道该寻找什么)某种智能排序算法。

智能排序算法是什么意思?让我们考虑一个例子:

我在表格中排列了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>

我应该寻找什么?

2 个答案:

答案 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