www.mikrocontroller.net

Forum: PC-Programmierung C# : Suchfunktion ?


Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich hab ein Array das 100 Dezimalzahlen enthält.
Nun möchte ich die 5 besten bzw. größten Zahlen davon ermitteln.
Wie könnte ich dies in C# realisieren? Danke im voraus.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo wrote:
> Hallo, ich hab ein Array das 100 Dezimalzahlen enthält.
> Nun möchte ich die 5 besten bzw. größten Zahlen davon ermitteln.
> Wie könnte ich dies in C# realisieren? Danke im voraus.

Array sortieren.
die ersten 5 Einträge sind deine gesuchten Zahlen

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
> Ingo wrote:
>> Hallo, ich hab ein Array das 100 Dezimalzahlen enthält.
>> Nun möchte ich die 5 besten bzw. größten Zahlen davon ermitteln.
>> Wie könnte ich dies in C# realisieren? Danke im voraus.
>
> Array sortieren.
> die ersten 5 Einträge sind deine gesuchten Zahlen

Nicht die letzten? Ausser man sortiert absteigend.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Severino R. wrote:
> Karl heinz Buchegger wrote:
>> Ingo wrote:
>>> Hallo, ich hab ein Array das 100 Dezimalzahlen enthält.
>>> Nun möchte ich die 5 besten bzw. größten Zahlen davon ermitteln.
>>> Wie könnte ich dies in C# realisieren? Danke im voraus.
>>
>> Array sortieren.
>> die ersten 5 Einträge sind deine gesuchten Zahlen
>
> Nicht die letzten? Ausser man sortiert absteigend.

Ein bischen was zum Nachdenken sollte für den TO ja auch bleiben :-)

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hast Recht!

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
> Ingo wrote:
>> Hallo, ich hab ein Array das 100 Dezimalzahlen enthält.
>> Nun möchte ich die 5 besten bzw. größten Zahlen davon ermitteln.
>> Wie könnte ich dies in C# realisieren? Danke im voraus.
>
> Array sortieren.
> die ersten 5 Einträge sind deine gesuchten Zahlen

Warum immer gleich sortieren?
    int[] inputArray = ...;
    int[] h5 = new int[5];
    h5[0] = h5[1] = h5[2] = h5[3] = h5[4] = int.MinValue;
    foreach (int i in inputArray) {
        if (i > h5[0]) {
            h5[4] = h5[3];
            h5[3] = h5[2];
            h5[2] = h5[1];
            h5[1] = h5[0];
            h5[0] = i;
        } else if (i > h5[1]) {
            h5[4] = h5[3];
            h5[3] = h5[2];
            h5[2] = h5[1];
            h5[1] = i;
        } else if (i > h5[2]) {
            h5[4] = h5[3];
            h5[3] = h5[2];
            h5[2] = i;
        } else if (i > h5[3]) {
            h5[4] = h5[3];
            h5[3] = i;
        } else if (i > h5[4]) {
            h5[4] = i;
        }
    }

Wenn mehrere gleiche Zahlen vorkommen dürfen funktioniert allerdings 
u.U. weder die Lösung mit Sortieren noch diese hier (die aber 
entsprechend angepasst werden können...).

Autor: Daniel V. (volte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwo haben wir ja auch mal was von Selection Sort, Bubble Sort, 
Insertion Sort und so gehört....... ;)

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel V. wrote:
> Irgendwo haben wir ja auch mal was von Selection Sort, Bubble Sort,
> Insertion Sort und so gehört....... ;)

Ja, und die .NET Entwickler auch, deshalb haben sie eine Array.Sort() 
Methode implementiert.

Autor: Thomas L. (tom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Darfs auch ein Einzeiler sein? (inkl. Sortierung und Ausschluss von 
Werten die mehrfach vorkommen?)

int[] arr = new int[] { 3, 3, 3, 9, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
14, 15, 16, 17, 18, 19, 20, 20, 20 };
List<int> l = new List<int>(from i in arr.Distinct() orderby i select 
i);
foreach (int i in l) Console.WriteLine(i);

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für eure bisherige Hilfe.
public int[] BubbleSort(int[] _Liste)
        {
            int xSize = _Liste.Length;
            int xVar1;
            int xVar2;
            int xvar3;
            for (xVar1 = (xSize - 1); xVar1 >= 0; xVar1--)
            {
                for (xVar2 = 1; xVar2 <= xVar1; xVar2++)
                {
                    if (_Liste[xVar2 - 1] > _Liste[xVar2])
                    {
                        xvar3 = _Liste[xVar2 - 1];
                        _Liste[xVar2 - 1] = _Liste[xVar2];
                        _Liste[xVar2] = xvar3;
                    }
                }
            }
            return _Liste;
        }
Ich verwende als Sortieralgo den BubbleSort. Nun ist es aber so das ich 
zum Schluss wissen muss, wie die Position bzw. Index der sortierten 
Zahlen lautet.Wie kann man da realisieren?

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo wrote:

> Ich verwende als Sortieralgo den BubbleSort.

Warum erfindest Du das Rad neu?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur als Prinzip (die Implementierung wird man ein klein wenig anders 
machen)

Du hast zb folgendes Array

   { 8, 2, 7, 1 }

jetzt machst du dir ein 2-tes Array dazu, welches du mit den Wert 0 bis 
zum höchsten Index füllst.

   { 8, 2, 7, 1 }
   { 0, 1, 2, 3 }

Wenn immer du in deinem Sortierverfahren, 2 Einträge vertauscht, dann 
tust du das auch mit deinem 2-ten Array. Wenn also ein Sortierschritt 
erfordert, die 8 mit der 2 zu vertauchen, so vertauscht du im 2-ten 
Array die 0 mit der 1

Aus
   { 8, 2, 7, 1 }
   { 0, 1, 2, 3 }

wird dann

   { 2, 8, 7, 1 }
   { 1, 0, 2, 3 }

usw. usw.
Ist dein erstes Array dann irgendwann fertig sortiert, dann landest du 
bei

   { 2, 1, 7, 8 }
   { 1, 3, 2, 0 }

Der dritte Eintrag ist zb. im sortierten Array die 7. Aber in deinem 
originalen Array war die 7 an Position 2 (der dritte Eintrag in deinem 
2-ten Array).

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:

> Ein bischen was zum Nachdenken sollte für den TO ja auch bleiben :-)

Dass Du dich immer wieder dazu erweichen lässt... naja, jedenfalls 
Kompliment, Du kannst wirklich gut darstellen und erklären.

Meistens jedenfalls:

> Ist dein erstes Array dann irgendwann fertig sortiert, dann landest du
> bei
>
>   { 2, 1, 7, 8 }
>   { 1, 3, 2, 0 }

*Fertig sortiert?*

Ich denke jedoch, Sortieralgorithmen sind im Web zur Genüge erklärt 
worden.

Die Frage ist doch eher, gibt es in .NET eine saubere TOP(n) Funktion 
(ähnlich wie in SQL) oder muss man die Zahlen selber suchen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Severino R. wrote:

>> Ist dein erstes Array dann irgendwann fertig sortiert, dann landest du
>> bei
>>
>>   { 2, 1, 7, 8 }
>>   { 1, 3, 2, 0 }
>
> *Fertig sortiert?*

Mpfh. Da muss ich jetzt selber schmunzeln :-)

> Die Frage ist doch eher, gibt es in .NET eine saubere TOP(n) Funktion
> (ähnlich wie in SQL) oder muss man die Zahlen selber suchen.

Keine Ahnung.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Severino R. wrote:
> Die Frage ist doch eher, gibt es in .NET eine saubere TOP(n) Funktion
> (ähnlich wie in SQL) oder muss man die Zahlen selber suchen.

Ist TOP(n) mittlerweile im SQL-Standard?

Linq-Variante mit Take
    var result = inputArray.Select((number, index) => new { value = number, pos = index }).OrderByDescending(x => x.value).Take(5);

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.