我们有一个未排序的 N 个数字序列(1,2,3,4,...N)。我们可以通过按特定顺序交换相邻元素来对整个序列进行排序。给定一个序列,如何计算对序列进行排序所需的最小可能交换。
作为示例,请考虑序列 {4, 2, 5, 3, 1}。
对此进行排序的最佳方法是按以下顺序使用 7 次交换
- 交换 3, 1:{4, 2, 5, 1, 3}
- 交换 5, 1:{4, 2, 1, 5, 3}
- 交换 4、2:{2, 4, 1, 5, 3}
- 交换 4, 1:{2, 1, 4, 5, 3}
- 交换 2, 1:{1, 2, 4, 5, 3}
- 交换 5、3:{1, 2, 4, 3, 5}
- 交换 3、4:{1, 2, 3, 4, 5}
贪心算法并没有被证明是有效的。反例很容易构建。接近解决方案的下一个明显选择是动态编程。
假设我们有一个未排序的序列:{A1, A2, ...Ai, A(i+1), ..., An}。我们知道对序列 {Ai, A(i+1), ..., An} 进行排序所需的最小交换次数为 Min[Ai, A(i+1), ..., An}。问题是找到 Min[A(i-1), Ai, ..., An]。
好吧,我脑海中浮现的第一个想法就是添加将 A(i-1) 放在已排序序列 {Ai, ..., An} 中的正确位置所需的步骤数。这是可行的:问题中给出的示例已使用完全相同的方法解决。
但我无法证明这个解决方案的有效性。我经常遇到这种情况。当我认为我已经解决了问题时,我能做的最好的事情就是获得一个“直观”的证明。我正在上高中,没有接受过算法方面的正式培训。我这样做纯粹是出于兴趣。
有没有严格的数学符号可以将这个问题转化为形式化证明?这个表示法可以推广到其他问题吗?如何?如果它能以高中生可以理解的形式呈现,我将不胜感激。