三值排序
排序是一种很频繁的计算任务。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。
写一个程序计算出,计算出的一个包括1、2、3三种值的数字序列,排成升序所需的最少交换次数。
输入第1行为类别的数量N(1≤N≤1000)
输入第2行到第N+1行,每行包括一个数字(1或2或3)。
输出包含一行,为排成升序所需的最少交换次数。
样例输入
9 2 2 1 3 3 3 2 3 1
样例输出
4
是一个贪心的思想。x=位置为1的地方非1的个数;y=位置为2的地方3的个数;z=位置为3的地方的2的个数。
ans=x+max(y,z);
1 #include"iostream" 2 #include"algorithm" 3 #define MAX 10000 4 using namespace std; 5 6 int a[MAX],num[4]; 7 int n, n1,n2,n3; 8 9 10 void msort(int n, int *a) 11 { 12 for (int i = 0; i< num[1];i++) 13 { 14 if (a[i] != 1) 15 n1++; 16 } 17 18 for (int i = num[1]; i< num[1]+num[2]; i++) 19 { 20 if (a[i] == 3) 21 n2++; 22 } 23 24 for (int i = num[1] + num[2]; i<n; i++) 25 { 26 if (a[i] == 2) 27 n3++; 28 } 29 } 30 31 int main() 32 { 33 n1 = n2 = n3 = 0; 34 cin >> n; 35 for (int i = 0; i<n; i++) 36 { 37 cin >> a[i]; 38 num[a[i]]++; 39 } 40 41 msort(n, a); 42 43 if (n2>n3) n1 += n2; 44 else n1 += n3; 45 cout<< n1; 46 47 system("pause"); 48 }