【发布时间】:2015-04-04 08:41:42
【问题描述】:
我被这个问题困住了:
给定 {0,1,2,...,n-1} 的排列 P
(这里 n = P . 长度)
解释为什么以下算法按升序对排列进行排序并给出最坏的情况(伪代码)
PermutationSort(P)
for i = 0 to P.length - 1
while(P[i] != i)
t = P[i]
exchange P[i] with P[t]
(C++代码)
void PermutationSort(int P[], int len)
{
for(int i = 0; i < len; i++)
while(P[i] != i)
{
int tmp;
tmp = P[i];
P[i] = P[tmp];
P[tmp] = tmp;
}
}
我完全不知道为什么它对排列 P 进行排序。
我整天都在研究这个问题,但我仍然不明白为什么它会对排列进行排序。
“用 P[P[i]] 交换 P[i]”是做什么的,为什么我们最终会得到 P[i] = i 从而终止内部循环?
感谢任何提示或帮助。
【问题讨论】:
-
大小为 N 的排列(当然)是
0,1,2,...,N-1,N。 IE。如果已排序,则数组索引[i]保存整数值i。 ... -
提示:每个排列都可以分解为不相交的cycles。考虑一下你的内部循环对包含
i和P[i]的循环做了什么。 -
@IlmariKaronen 非常感谢您的提示。我研究了互联网并阅读了一些论文,现在我(几乎)理解了它。它实际上类似于“循环”排序。
标签: c++ algorithm sorting permutation