題目与华为的面试题类似,只能与0元素交换。
考虑情况:
1、0交换到了位置0,但仍有元素未被交换,需要多换2次。
2、初始位置为0,比不初始为0的多交换两次
3、计算环数与不在位个数。
代码:
#include "iostream"
#include "vector"
#include "string"
#include "cstring"
using namespace std;
int main()
{
int N, group = 0, swap = 0;
cin >> N;
int num[100000];
bool visit[100000];
for (int i = 0; i < N; i++)
cin >> num[i];
memset(visit, false, sizeof(visit));
for (int i = 0; i < N; i++)
{
if (visit[i] || num[i] == i)
continue;
group++;
int j = i;
while (visit[j] == false)
{
swap++;
visit[j] = true;
j = num[j];
}
}
if (num[0])cout << swap + group - 2;
else cout << swap + group;
return 0;
}
本文介绍了一种基于数组的排序优化算法,特别适用于包含0元素的情况。通过计算元素交换次数和环的数量来减少不必要的操作,从而达到高效排序的目的。
318

被折叠的 条评论
为什么被折叠?



