Sorting a Three-Valued Sequence(三值排序)

Description

排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候。 在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。 写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。

Input

Line 1: N (1 <= N <= 1000) Lines 2-N+1: 每行一个数字,共N行。(1..3)

Output

共一行,一个数字。表示排成升序所需的最少交换次数。

Sample Input

9
2
2
1
3
3
3
2
3
1

Sample Output

4


解题思路:这是一道贪心题,分别统计1,2,和3出现的次数,分成1,2,和3的区间。贪心策略,每一次交换尽可能的使交换得到的数分配到
应该到的区域,这样才能得到最少交换次数。

上代码:
 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 int main()
 6 {
 7     int n,i,j,count1=0,count2=0,count3=0,count=0;
 8     int  a[10001];
 9     scanf("%d",&n);
10     for(i=0; i<n; i++)
11     {
12         scanf("%d",&a[i]);
13         if(a[i]==1)///分别统计1,2,3出现的次数,来划分区间
14             count1++;
15         if(a[i]==2)
16             count2++;
17         if(a[i]==3)
18             count3++;
19     }
20     for(i=0;i<count1;i++)
21     {
22         if(a[i]==2)
23         {
24             for(j=count1;j<n;j++)
25             {
26                 if(a[j]==1)
27                     {
28                         swap(a[i],a[j]);
29                     count++;
30                     break;
31                     }
32             }
33         }
34         if(a[i]==3)
35         {
36             for(j=n-1;j>=count1;j--)
37             {
38                 if(a[j]==1)
39                 {
40                     swap(a[i],a[j]);
41                     count++;
42                     break;
43                 }
44             }
45         }
46     }///1的区间里面将全部换成1
47     for(i=count1;i<count1+count2;i++)
48     {
49         if(a[i]==3)
50         {
51             for(j=count1+count2;j<n;j++)
52             {
53                 if(a[j]==2)
54                 {
55                     swap(a[i],a[j]);
56                     count++;
57                     break;
58                 }
59             }
60         }
61     }///2的区间里面将全部换成2,那么自然而然3的区间也都是3
62     printf("%d
",count);
63     return 0;
64 }



原文地址:https://www.cnblogs.com/wkfvawl/p/8715615.html