三值的排序

题目

题目描述
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种 1,2 和 3。我们用交换的方法把他排成升序的。写一个程序计算出,给定的一个 1,2,3 组成的数字序列,排成升序所需的最少交换次数。
输入描述
第一行:奖牌个数 N(1≤N≤1000)
第二行到第N+1行:每行一个数字,表示奖牌。共 N 行。(1…3)
输出描述
共一行,一个数字。表示排成升序所需的最少交换次数。
在这里插入图片描述

数学解析

题目提取

输入

sum1sum2sum3-
one1two1three1sum1
one2two2three2sum2
one3two3three3sum1

目的

sum1sum2sum3-
sum100sum1
0sum20sum2
00sum3sum1

操作

进行交换,且需保持横、纵sum1、sum2、sum3均不变

过程

若one2>two1

sum1sum2sum3-
one100sum1
0two2+two2three2+one2-two2sum2
0two3three3+one3sum1

得: sum=one2+one3+two3

若two1>one2

sum1sum2sum3-
one100sum1
0two2+two1three2+one2-two1sum2
0two3three3+one3sum1

得: sum=two1+one3+two3

c++源码

//三值的排序
#include<iostream>
using namespace std;
int main()
{
 int i,N,*x,sum=0,sum1=0,sum2=0;
 int one2=0,one3=0,two1=0,two3=0;
 cin>>N;
 x=new int[N];
 for(i=0;i<N;i++)
 {
  cin>>x[i];
  if(x[i]==1)
   sum1++;
  else if(x[i]==2)
   sum2++;
 }
 for(i=0;i<sum1;i++)
  if(x[i]==2)
   one2++;
  else if(x[i]==3)
   one3++;
 for(i=sum1;i<sum1+sum2;i++)
  if(x[i]==1)
   two1++;
  else if(x[i]==3)
   two3++;
 sum=one3+two3+((one2>two1)?one2:two1);
 cout<<sum<<endl;
 return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值