1. 程式人生 > 實用技巧 >25.計算中值

25.計算中值

一. 問題

1. 定義:中值使得一個序列中一半元素在它之前,一半元素在它之後。

2. 問題:求出一個序列的中值。

二. 思路

我們有一個序列,需要知道序列元素的個數。當有奇數個元素時,中值自然就是最中間的數字;當有偶數個元素時,需要將最中間的兩個元素相加,求得的平均值就是序列的中值。

序列的元素可以是任何型別的(比如整數,浮點數等),我們需要先將這個序列排序,再進行上述運算。如果不進行排序,那麼這個中值沒有意義。

舉個栗子:

1.有一個序列 1, 2, 3, 4, 5,包含5個元素,它的中值是3。

2.有一個序列1, 2, 3, 4, 5, 6, 包含6個元素,它的中值是中間元素3和4相加的平均值。

我們要特別注意下標的計算,因為下標從0開始。

三. 程式碼實現

 1 double get_mid_value(const vector<int> &values) {
 2     int total_val = values.size();
 3     double mid_value = 0.0;
 4     if (total_val % 2 == 0) {
 5         mid_value = static_cast<double>((values[total_val / 2] + values[total_val / 2 - 1])) / 2;
6 } else { 7 mid_value = values[total_val / 2]; 8 } 9 10 return mid_value; 11 }

主函式測試如下:

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int main() {
 7     vector<int> ages;
 8     int current_age = 0
; 9 cout << "Enter age : "; 10 while (cin >> current_age) { 11 ages.push_back(current_age); 12 cout << "Enter age : "; 13 } 14 15 sort(ages.begin(), ages.end()); 16 double mid_age = get_mid_value(ages); 17 cout << "Middle age = " << mid_age << endl; 18 19 return 0; 20 }

程式碼中有幾處需要說明:

1. 函式接受一個常量引用,因為它不修改序列內容。

2. 假設序列元素為整數型別,但是中值仍然有可能是浮點數,所以應該返回一個浮點型別。

3. 注意函式中對於下標的計算。

4. 程式碼中為了簡潔沒有使用模板,沒有進行錯誤處理,但是大家應該知道這個函式應該能夠處理不同種類的資料。