1. 程式人生 > 其它 >眾數問題

眾數問題

技術標籤:演算法學習記錄演算法

題目要求:
在一個包含n個元素的多重集合S中,每個元素在S中出現的次數稱為該元素的重數,多重集合S中重數最大的元素稱為眾數
舉例來說,多重集合S={1,2,3,3,3,3,4,4,5},則多重集合S的眾數是3,元素3的重數為4
現要求對隨機生成的由n個自然陣列成的多重集合S,程式設計計算S的眾數及其重數

主要思路:
先生成含有N個元素的隨機陣列,定義兩個陣列,一個用來存放陣列元素,一個用來存放各元素的個數,找出個數最大的下標對應的陣列元素。

第一步是呼叫隨機數生成陣列,這裡我為了方便,將隨機數的生成範圍取為10以內,後面可以更改。

第二步是計算每個元素的個數,為了後續在找出眾數時,不會重複,我把每個元素的個數定位從自己往後的計數,這樣,如果出現了多次3,最多的個數是最前面的,後面的會依次少1。

第三步是通過一次迴圈,找出個數值最大的,這裡找出的是第一次的最大,就是說如果數字2出現4次,數字5出現4次,這裡找出的是數字2對應的4。

第四步是找出所有個數值都是最大值的元素。例如上面的例子,這次就會找出個數值也為4的數字5.

#include<iostream>
#include<iomanip>
#include<time.h>
using namespace std; //隨機數函式標頭檔案
void print(int arr[], int n)
{  
    for(int j=0;j<n;j++)
	{  
      cout<<
arr[j]<<'\t'; } cout<<endl; } int main() { int N; cout<<"請輸入隨機生成的整數序列的數字個數:"; cin>>N; int a[1000],b[1000]; srand(time(0)); //呼叫隨機數 for(int k=0;k<N;k++) { a[k]=1+rand()%10; //隨機數的使用方法 } cout<<"隨機生成的陣列為:\n"; print
(a,N); for(int m=0;m<N;m++)//每個元素的個數清零 { b[m]=0; } for(int n=0;n<N;n++)//記錄每個元素從自己(包含自己)往右的個數 { for(int j=n;j<N;j++) { if(a[n]==a[j]) b[n]++; } } //print(b,N); int same,max=-1; for(int i=0;i<n;i++) { if(b[i]>max) { max=b[i]; same=a[i]; } } //cout<<same<<" "<<max<<'\n'; cout<<"集合的眾數是:"; for(int s=0;s<n;s++) { if(b[s]==max) cout<<a[s]<<" "; } cout<<"該眾數的重數是"<<max<<'\n'; return 0; }