思路
- 1.其实很简单,找到0放在哪个位置上,如果0就放在0的位置上,则找出后面的第一个出错的位置与之交换即可,如果0不在0的位置上,则把0与该应该在该位置上的点交换即可。
- 2.对于0不在0的位置上,例如,40213,排好序应该是01234,即0在1的位置上,则把0与1交换,得到41203,此时,1就在正确的位置上了,而此时0又要继续上述步骤。
- 3.对于0在自己位置上了,但是后面可能还是没有排好序,例如,01243,则把0与第一个出错的位置4上的值交换,得到41203,这个问题又变为问题2了。
我出错的一些点
- 1.这道题要找到0应该与那个位置交换不好统计,但是如果用
a[value]=i
来记录数值value
目前在那个位置上就方便很多了。
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> a(n);
int b;
for (int i = 0; i < n; i++)
{
cin >> b;
a[b] = i;
}
int c = 0,num=0;
while (c<n)
{
if (a[0] == 0)
{
for (; c < n&&a[c] == c; c++);
if (c>=n)break;
swap(a[0], a[c]);
num++;
}
else
{
swap(a[0], a[a[0]]);
num++;
}
}
cout << num << endl;
return 0;
}
思路二
- 1.只能与0交换与只能与第一个位置上的数交换来排序的次数是一样的,那么就不必找0的位置了,既可以把其他的所有的数都与随机的一个位置(这里就取a[0])交换即可。
- 2.例如,40213,
a[0]=4!=0
,则将其与a[4]
交换得到30214,此时4就在正确的位置上了,然后继续上述循环,并且也分俩种情况,方式与思路一大同小异。
代码
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char** argv) {
int n,c=0;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int num = 0;
while (c<n)
{
if (a[0] == 0)
{
for (; c < n&&a[c] == c; c++);
if (c>=n)break;
swap(a[0], a[c]);
num++;
}
else
{
swap(a[0], a[a[0]]);
num++;
}
}
cout << num << endl;
return 0;
}