9.2 Bubblesort-Indexsortierung
Hier sind noch einmal die Messwerte aus dem Kapitel "Interpolation", jedoch sind sie etwas durcheinander geraten:
| Objektentfernung in mm | gemessene Ausgangsspannung |
|---|---|
| 180.0 | 0.742 |
| 150.0 | 0.884 |
| 120.0 | 1.084 |
| 270.0 | 0.574 |
| 240.0 | 0.590 |
| 300.0 | 0.455 |
| 60.0 | 2.035 |
| 210.0 | 0.667 |
| 90.0 | 1.425 |
| 30.0 | 3.140 |
Tabelle 9.2-1: Messwertpaare für den Infrarot-Entfernungssensor unsortiert
Diese sollen jetzt mit Hilfe von Bubblesort so sortiert werden, dass die Objektentfernung wieder ansteigend geordnet ist.
Stellen Sie sich vor wir würden jetzt einfach die Objektentfernungen nehmen und ordnen. Das wäre schon ein guter Anfang, jedoch wäre diesen Werten nicht mehr die jeweils zugehörige Ausgangsspannung zugeordnet.
Dieser Fall, dass ein Datensatz aus mehreren Komponenten besteht und nur bezüglich einer geordnet werden soll tritt eigentlich öfter auf, als das sortieren einfacher Elemente. Eine Lösung hierfür stellt dar, sich bem Sortieren zu merken, das wievielte Element die geordneten Elemente jeweils in der alten Reihenfolge darstellten. Man merkt sich also die neue Reihenfolge der alten Indices.
Dem folgenden Programm kann als Parameter in der Konsole das File "daten.txt" übergeben werden, in dem die Messdatenpaare so wie in obiger Tabelle dargestellt paarweise liegen.
Diese Messwertpaare werden dann in x- (Spannung) und y-Wert (Entfernung) aufgeteilt und zudem noch ein Array "index" erzeugt, in dem einfach die Werte 0,1,2,3,...,n stehen.
Die x-Werte werden dann mit einem Bubble-Sort-Algorithmus sortiert. Dieser wurde aber so erweitert, dass bei jeder Vertauschung der x-Werte, auch die korrespondierenden index-Werte mit vertauscht werden. In index kann deshalb nach dem Sortieren abgelesen werden, in welcher Reihenfolge die alten Messwerttabellenzeilen in der neuen sortierten Ordnung stehen müssen.
Beim Schleifendurchgang ganz unten wird dann mit ywerte[index[i]] auch die Entfernung in der
richtigen sortierten Reihenfolge abgespeichert.
#include <iostream>
#include <fstream>
#include <vector>
#include <time.h>
#include "vektordef.h"
#include "lesen.h"
using namespace std;
void sortiereindex(double* wert,int* index,int anzahl)
{
double hilf;
int ihilf;
bool gefunden = true;
int k=0;
double* x = new double[anzahl];
for(int i=0;i<anzahl;i++)
x[i] = wert[i];
while(gefunden && k<anzahl-1)
{
gefunden = false;
for(int i=k;i<anzahl-1;i++)
{
if(x[i]>x[i+1])
{
hilf = x[i];
x[i] = x[i+1];
x[i+1] = hilf;
ihilf = index[i];
index[i] = index[i+1];
index[i+1] = ihilf;
gefunden=true;
}
}
}
}
int main(int anzahl,char** eingabe)
{
if(anzahl!=3)
{
cout<<"Benutzung:"<<anzahl<<endl;
cout<<"bubbleindex <Filename in> <Filename out>"<<endl;
cout<<"In dem Input-File sollten Messwertpaare stehen."<<endl;
}
else
{
Doublevektor messungen = lesen(eingabe[1]);
int anzahl = messungen.size()/2;
double* xwerte = new double[anzahl];
double* ywerte = new double[anzahl];
int* index = new int[anzahl];
for(int i=0;i<anzahl;i++)
{
xwerte[i] = messungen.at(i*2);
ywerte[i] = messungen.at(i*2+1);
index[i] = i;
}
clock_t t1,t2;
t1 = clock();
sortiereindex(xwerte,index,anzahl);
t2 = clock();
cout<<"Dauer der Berechnung:"<<(double)(t2-t1)/CLOCKS_PER_SEC<<" Sekunden"<<endl;
ofstream speichern(eingabe[2]);
for(int i=0;i<anzahl;i++)
speichern<<xwerte[index[i]]<<" "<<ywerte[index[i]]<<endl;
speichern.close();
}
return 0;
}
Code 9.2-1: C++ Programm "bubbleindex.cpp"
Programm bubbleindex, .cpp, .h und .exe - Dateien gepackt