配列の中央値を求めるプログラムで毎回0しか出力されない問題について
繰り返し処理の各処理におけるパフォーマンスの中央値を求めるプログラムを書いています。
以下の記事を参考にして、配列から中央値を求める部分を書きました。
Vectorの平均値と中央値を求める
コンパイルエラーはなく、実行時の出力において、中央値の箇所が毎回「0」になってしまうという問題があります。
どのように、プログラムを修正すべきか検討がつかず、教えていただきたいです。
出力
173,
85,
85,
85,
After Sorted
85,
85,
85,
173,
0
現行のコード
#include <chrono>
#include <iostream>
#include <thread>
#include <vector>
#include <algorithm>
#include <iostream>
//繰り返し処理全体にかかった時間
using namespace std::chrono;
double median(std::vector<double>v) {
size_t size = v.size();
std::vector<double> _v(v.size());
copy(v.begin(), v.end(), back_inserter(_v));
double tmp;
for (int i = 0; i < size - 1; i++){
for (int j = i + 1; j < size; j++) {
if (_v[i] > _v[j]){
tmp = _v[i];
_v[i] = _v[j];
_v[j] = tmp;
}
}
}
if (size % 2 == 1) {
return _v[(size - 1) / 2];
} else {
return (_v[(size / 2) - 1] + _v[size / 2]) / 2;
}
}
int main()
{
#define N 2
double A[N][N] = {
{3.0, 5.0},
{9.0, 5.0}
};
double B[N][N] = {
{3.0, 6.0},
{8.0, 9.0}
};
double C[N][N] = {
{0.0, 0.0},
{0.0, 0.0}
};
int i, j, k, n;
//各足し算にかかった時間を入れる配列
std::vector<double> timedata;
for(i=0; i<N; i++){
for(j=0; j<N; j++){
//測定開始
std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now();
C[i][j] += A[i][j]+B[i][j];
//測定終了
high_resolution_clock::time_point end = high_resolution_clock::now();
double time = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
//配列にappend
timedata.push_back(time);
}
}
//ソート前
for (auto value : timedata) {std::cout << value << ", ";
std::cout << std::endl;
}
//配列をソート
std::cout << "After Sorted"<< std::endl;
std::sort(timedata.begin(), timedata.end());
for (auto value : timedata) {std::cout << value << ", ";
std::cout << std::endl;
}
double ans = median(timedata);
std::cout << ans << std::endl;
}