日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

三值排序

發布時間:2025/3/12 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三值排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

排序是一種很頻繁的計算任務。一個實際的例子是,當我們給某項競賽的優勝者按金銀銅牌排序的時候。在這個任務中可能的值只有三種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

#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int main(){int n,a[1001];cin>>n;for(int i=0;i<n;++i){cin>>a[i]; }int sum1=0,sum2=0,sum3=0,sum=0;for(int i=0;i<n;++i){if(a[i]==1)sum1++;//一的個數if(a[i]==2)sum2++;//二的個數if(a[i]==3)sum3++;//三的個數}//最后一定是1(sum1個)2(sum2個)3(sum3個)int num1=0,num2=0,num=0;for(int j=sum1;j<n-sum3;++j){if(a[j]==3)num1++;//在第二部分是三的個數} for(int j=n-sum3;j<n;++j){if(a[j]==2)num2++;//第三部分是二的個數}num=max(num1,num2);//這樣二和三之間的交換完畢,現在就剩下1和二三之間的交換了//在第一部分不是一的個數就是剩下的需要交換的次數for(int j=0;j<sum1;++j){if(a[j]!=1)sum++;//求出來第一部分不是一的個數}cout<<num+sum<<endl; }

總結

以上是生活随笔為你收集整理的三值排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。