三值的排序
题目描述
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。
写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。
分析:要求最少交换次数,最优的方法就是交换两个不在正确位置上的数后它们刚好在正确的位置上,这样做一遍后,剩下的就只有在正确位置上的数和不在正确位置上且两两之间交换都不在正确位置上的数,这就需要三个数交换,计算可知最少需要2次交换就能把三个数放在正确位置上,所以最后统计一下不在位置上的1就可以了。
时间复杂度:O(n^2)
代码
const
maxn=1000;
var
a,b:array[0..maxn] of longint;
n,i,j,ans,x1,x2:longint;
begin
readln(n);
for i:=1 to n do
begin
readln(a[i]);
if a[i]=1 then inc(x1);
if a[i]<>3 then inc(x2);
end;
for i:=1 to n do
begin
if i<=x1 then b[i]:=1 else b[i]:=2;
if i>x2 then b[i]:=3;
end;
for i:=1 to n do
for j:=1 to n do
if (a[i]<>a[j]) and (a[i]=b[j]) and (a[j]=b[i]) then
begin
a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
inc(ans);
end;
j:=0;
for i:=1 to n do
if (a[i]<>b[i]) and (a[i]=1) then inc(j);
inc(ans,j*2);
writeln(ans);
end.