c++找眾數及其重數
阿新 • • 發佈:2019-02-09
問題描述:在一個由n個元素組成的表中,出現次數最多的元素被稱為眾數。試寫一個尋找眾數及其重數的有效演算法,並分析其計算時間複雜性。
方法:
1. 首先用快排把資料排個序
2. 再使用find方法找出眾數及其重數
注:這裡第一步就跳過了,因為快排可以調庫函式,這裡主要是測試一下find方法的正確性。
程式碼如下:
#include <iostream>
using namespace std;
void find(int a[],int n){
int i;
int c[n];//(1)
for (i=0;i<n;i++){
c[i]=0 ;
}
for (i = 0; i < n;)
{
c[i]=1;
int j=i;//(2)
while(a[i]==a[j]){
if (a[i]==a[i+1])
{
i++;c[j]++;
}
else{
i++;
}
}
}
int max=c[0],k=0;//(3)
for (int i = 0; i < n; i++)
{
if(max<c[i]) {
max=c[i];
k=i;
}
}
cout<<"眾數是:"<<a[k]<<"重數是:"<<max<<endl;
}
int main(int argc, char const *argv[])
{
int a[5]={1,1,2,2,3};
find(a,5);
return 0;
}
注:
- (1)位置的c陣列是儲存a陣列對應位置數出現的次數,這樣也就為能找出多個眾數做了鋪墊
- (2)位置的j儲存了一串相同數的第一個數的下標
- (3)我這裡只找出了一個眾數及其重數,但是可以再遍歷一遍,把所有c中等於max的值找出來並列印,很簡單,這樣就能找出所有眾數了。用c陣列的作用也就突出在這裡,雖然我沒寫,懶啊~小記至此