C++ :: Aufgabe #316

1 Lösung Lösung öffentlich

Median zweier zusammengefügter Arrays

Fortgeschrittener - C++ von JKooP - 21.11.2020 um 07:46 Uhr
Es soll der Median (Zentralwert) eines sortierten Arrays,
das aus zwei (beliebig großen) zusammengefügten sortierten Arrays besteht, ermittelt werden.

Beispiele:
arr1 = [1, 3] arr2 = [2]
mergeSorted = [1, 2, 3] -> Median = 2

arr1 = [2, 4] arr2 = [1, 3]
mergeSorted = [1, 2, 3, 4] -> Median = 2.5
(wenn kein Zentralwert vorhanden ist, dann wird das arithmetische Mittel der beiden mittleren Zahlen ermittelt)
-> (2+3) / 2 = 2.5

Weitere Beispiele:
[0, 0] [0, 0] -> 0
[] [4] -> 4
[3] [] -> 3
[] [] -> 0
[-4, 4] [-2, 1] -> [-4, -2, 1, 4] -> -0.5

Fortgeschrittene können die Funktion/Methode dahingehend erweitern,
sodass sowohl mindestens 2 Arrays aufgenommen werden,
als auch auch ein Array bzw. eine Liste von Arrays verarbeitet werden kann.


Viel Spaß

Lösungen:

vote_ok
von JKooP (18090 Punkte) - 24.04.2021 um 22:49 Uhr
C++ 17
Quellcode ausblenden C-Code
#include "median.h"

int main()
{
    vector<int> v1{ -1, 1, 2, 3, 4 };
    vector<int> v2{ -1, 0, 1, 2, 5 };
    median m{ v1, v2 };

    std::cout << m.get_median();
}

.h
Quellcode ausblenden C-Code
#pragma once
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class median
{
private:
	vector<int> v1_, v2_, v3_;
	int get_center();
	vector<int> get_concat_sorted_vector();
	
public:
	median(vector<int> v1, vector<int> v2) :v1_{ v1 }, v2_{ v2 }, v3_{ get_concat_sorted_vector() }{}
	double get_median();
};



.cpp
Quellcode ausblenden C-Code
#include "median.h"

int median::get_center()
{
    return (int)floor(v3_.size() / 2.0);
}

vector<int> median::get_concat_sorted_vector()
{
    auto vt{ v1_ };
    vt.insert(vt.end(), v2_.begin(), v2_.end());
    sort(vt.begin(), vt.end());
    return vt;
}

double median::get_median()
{
    auto m{ 0.0 };

    if (v3_.size() == 0)
        m = 0;
    else if (v3_.size() % 2 != 0)
        m = v3_[get_center()];
    else
        m = (v3_[get_center() - 1] + v3_[get_center()]) / 2.0;

    return m;
}