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\n",count);
63     return 0;
64 }
 
   

 

 
  

转载于:https://www.cnblogs.com/wkfvawl/p/8715615.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值