Files
courses/2023_Informatik_b/4/mergesort.cpp
T
2024-11-14 13:11:04 +01:00

59 lines
2.2 KiB
C++

/*
g++ -std=c++14 -Wall -Wextra -Werror -pedantic ./w4/hilfsfunktionen.cpp ./w4/mergesort.cpp -o ./bin/mergesort
Dieser Algorithmus verwendet den Divide-and-Conquer-Ansatz, um das Array zu sortieren. Zuerst wird das Array in zwei Hälften geteilt.
Diese Hälften werden dann rekursiv sortiert (mit mergeSortHelp). Danach werden die beiden sortierten Hälften mit der merge Funktion
zusammengeführt. Dieser Prozess wird fortgesetzt, bis das gesamte Array sortiert ist. Im Hauptprogramm (main) wird der Merge Sort
Algorithmus auf ein Testarray angewendet und das Array vor und nach der Sortierung ausgegeben.
*/
#include <vector>
#include "hilfsfunktionen.hpp"
void merge(std::vector<int>& elems, unsigned begin, unsigned mid, unsigned end){
// Kopiere die erste und zweite Hälfte des zu sortierenden Bereichs in neue Vektoren
std::vector<int> firstHalf = hf::copy(elems, begin, mid);
std::vector<int> secondHalf = hf::copy(elems, mid, end);
// Initialisiere Zähler für die beiden Hälften
unsigned i = 0;
unsigned j = 0;
// Iteriere durch den zu sortierenden Bereich
while(begin + i + j < end){
// Wenn alle Elemente aus der zweiten Hälfte kopiert wurden oder das aktuelle Element der ersten Hälfte kleiner ist als das der zweiten Hälfte
if ( j >= secondHalf.size() || ((i<firstHalf.size()) && (firstHalf[i]<secondHalf[j]))){
// Kopiere das aktuelle Element der ersten Hälfte in den ursprünglichen Vektor
elems[begin+i+j] = firstHalf[i];
i++;
}else{
// Kopiere das aktuelle Element der zweiten Hälfte in den ursprünglichen Vektor
elems[begin+i+j] = secondHalf[j];
j++;
}
}
}
void mergeSortHelp(std::vector<int>& elems, unsigned start, unsigned end){
if(start==end||start==end-1){
return;
}
unsigned mid = (start+end)/2;
mergeSortHelp(elems, start, mid);
mergeSortHelp(elems, mid, end);
merge(elems, start, mid, end);
}
void mergeSort(std::vector<int>& elems){
mergeSortHelp(elems, 0, elems.size());
}
int main(){
std::vector<int> test = {1,4,2,67,3,76,13,8,10,22,6,9,5,11,32,0};
hf::gebe_aus(test, 0, test.size());
mergeSort(test);
hf::gebe_aus(test, 0, test.size());
}