Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 23:14

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Elementarschritt im Bubblesort

Discussion on Elementarschritt im Bubblesort within the General Coding forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 30
Join Date: Feb 2006
Posts: 1,724
Received Thanks: 465
Elementarschritt im Bubblesort

Huhu,

ich sitz gerade an ner Uni-Aufgabe und weiß zum ersten mal nicht, was ich zutun hab :|.

Quote:
Wir betrachten das Problem SecondLargest:
Input: eine Folge a von n ganzen Zahlen
Output: das zweitgrote Element der Folge
(a) Entwickeln Sie einen Algorithmus in Python- oder Java-Code, der das Problem lost.
(b) Wieviele Elementarschritte (Vergleiche, Zuweisungen, arithmetische Operationen,
boolesche Operationen, . . . ) benotigt Ihr Algorithmus in Abhangigkeit von n?
ich hab mich zur Lösung für nen BubbleSort entschieden, bei dem er dann einfach das 2. Glied ausgibt (bzw solang nach hinten rutscht bis n != n-1)

Allerdings komme ich auf die Elementarschrittfrage nicht klar..

Vergleiche gibt es ja maximal soviele, wie viele Zahlen verglichen werden..
also zB bei
1,8,3,4
gibt es 4 durchläufe, bis sicher das größte vorne ist..innerhalb dieser durchläufe gibt es maximal 3 Vertauschungen..4x3 = 12..
etc..aber ich weiß nicht was mit dem Rest sein soll..außerdem ist dies ja die maximale Anzahl an Vertauschungen..und variable, je nach eingabe.

Wäre Klasse, wenn jemand Rat weiß.

Code:
# coding=latin-1
def bubblesort(glieder):
 
        maxdurchlaeufe = len(glieder) #Bestimmung der maximalen Anzahl an Tauschvorgängen
        n = len(glieder) - 1 #Da die 2.größte ausgegeben werden soll
 
        while maxdurchlaeufe >= 1: #durchlaufcounter
 
                for k in range(len(glieder) - 1): #beginn forschleife
 
                        if glieder[k] > glieder[k+1]: #falls Position k+1 kleiner als k tausche
 
                                temp = glieder[k]    #zwischenspeichern von zahl k in temp          
 
                                glieder[k] = glieder[k+1] #k+1 nach k
 
                                glieder[k+1] = temp #k in k+1 (Ende Tausch)
 
                maxdurchlaeufe = maxdurchlaeufe - 1  #durchlaufcounter--
 
        while glieder[n] == glieder[n-1]: #falls letzte beiden Zahlen gleich solang zurückgehen bis seq[n] != seq[n-1]
            n -= 1
        return glieder[n-1] #Ausgabe 2. größte Zahl
kaiN_92 is offline  
Old 04/22/2012, 13:29   #2
 
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,345
Es gibt immer n * (n - 1) Durchläufe. Deine While-Schleife läuft immer n-Mal und deine innere For-Schleife (n-1)-Mal.
Dein Algorithmus bricht nicht ab wenn es bei einem Durchlauf keine Vertauschungen gab, deswegen ist die Anzahl immer gleich.
ms​ is offline  
Thanks
1 User
Old 04/22/2012, 13:32   #3
 
elite*gold: 30
Join Date: Feb 2006
Posts: 1,724
Received Thanks: 465
Arg..stimmt -_-"..

Da ich Python-Krüppel bin hab ich gar keine Abbruchbedingung drin..total verplant !

Danke !
kaiN_92 is offline  
Old 04/22/2012, 13:55   #4
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
außerdem ist bei der aufgabenstellung (wenn es denn die originale ist) der bubblesort wie mit kanonen auf spatzen zu schießen.
musst ja nicht das gesamte array sortieren, sondern nur das 2. größte element FINDEN!
d.h. gehst linear durch, speicherst immer die beiden größten ab:
pseudocode:
Code:
	int max1 = 0; // größtes element
	int max2 = 0; // 2. größtes element
	for (int i = 0; i < n; i++)
	{
		if (array[i] > max1)
		{
			max2 = max1;
			max1 = array[i];
		}
		else if (array[i] > max2)
		{
			max2 = array[i];
		}
	}
	printf("2. Grösstes Element: %d\n", max2);
vorgabe ist dabei, dass alle elemente in der liste > 0 sind, ansonsten musst du die initialisierungen von max1/2 bei nem int auf -2,147,483,648 setzen, o.ä. tricks.
ist vielleicht nicht die sauberste lösung, aber die schnellste, da maximal n*2 vergleiche durchgeführt werden und maximal n kopiervorgänge.
ist ungetestet und hat vllt nen paar kleinere häkelchen, z.b. dass in dem array mindestens 2 elemente drin sein müssen, die initwerte von max1/2 kleiner als mindestens 2 der arrayelemente sein müssen, ???...
mehr fällt mir so jetzt nicht ein...

kann auch gut sein, dass man da noch was optimieren kann, war jetzt 20 second brainstorm
Dr. Coxxy is offline  
Old 04/22/2012, 14:20   #5
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Quote:
Input: eine Folge a von n ganzen Zahlen
Quote:
Originally Posted by Dr. Coxxy
int max1 = 0; // größtes element
int max2 = 0; // 2. größtes element
Failbob..

Trivialerweise versagt dein Code schon bei der Folge 1,2.... 20s brainstorm vllt doch bisschen zu wenig für dich..

Mein Ansatz wäre spontan zweimal das Maximum zu bilden, wobei das erste Maximum vor dem zweiten Durchgang aus der Folge entfernt wird.

EDIT: Wenn du cool bist, machst du das via Rekursion.
xNopex is offline  
Thanks
1 User
Old 04/22/2012, 14:30   #6
 
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
Quote:
Originally Posted by Dr. Coxxy View Post
vorgabe ist dabei, dass alle elemente in der liste > 0 sind, ansonsten musst du die initialisierungen von max1/2 bei nem int auf -2,147,483,648 setzen, o.ä. tricks.
Es wäre auch viel zu einfach, max1 auf den wert des 1.Elementes zu setzen :<
MoepMeep is offline  
Old 04/22/2012, 14:31   #7
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
jaja, wie schrecklich, nen kleinen copy vergessen, habs korrigiert...

Code:
	int max1 = 0; // größtes element
	int max2 = 0; // 2. größtes element
	for (int i = 0; i < n; i++)
	{
		if (array[i] > max1)
		{
			max2 = max1;
			max1 = array[i];
		}
		else if (array[i] > max2)
		{
			max2 = array[i];
		}
	}
	printf("2. Grösstes Element: %d\n", max2);
das was nopex erwähnt hat mit 2x maximum hab ich auch schon gedacht, aber so dürfte es ein wenig schneller sein, vorteil ist natürlich, dass das mit ner rekursion auch eine n-te lösung einfach finden lassen sollte, während man bei meiner im worst case das ganze array doppelt hat...

@moep:
geht ja auch nicht:
Code:
-1, -2, -3, -4
Dr. Coxxy is offline  
Old 04/22/2012, 14:36   #8
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Trotzdem will er ganze Zahlen und nicht natürliche mit 0..
xNopex is offline  
Old 04/22/2012, 14:41   #9
 
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
Da klein coxxy es anscheinend nicht versteht :<
Code:
int max1 = array[0] > array[1]?array[0]:array[1];
int max2 = array[0] > array[1]?array[1]:array[0];
Natürlich vorher prüfen, ob das Array überhaupt so groß ist
MoepMeep is offline  
Old 04/22/2012, 14:42   #10
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Code:
	int max1 = array[0] >= array[1] ? array[0] : array[1]; // größtes element
	int max2 = array[0] <= array[1] ? array[0] : array[1]; // 2. größtes element

	for (int i = 0; i < n; i++)
	{
		if (array[i] > max1)
		{
			max2 = max1;
			max1 = array[i];
		}
		else if (array[i] > max2)
		{
			max2 = array[i];
		}
	}
	printf("2. Grösstes Element: %d\n", max2);
EDIT:
und moep war 30 sekunden schneller als ich...
dann sag das auch, anstatt die "lösung" hinterherzuschieben.

Quote:
Es wäre auch viel zu einfach, max1 auf den wert des 1.Elementes zu setzen :<
das hier ist nämlich eindeutig falsch.
Dr. Coxxy is offline  
Old 04/22/2012, 14:43   #11
 
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
Und wo ist die Überprüfung ob das Array überhaupt 2 Elemente hat?
MoepMeep is offline  
Old 04/22/2012, 14:45   #12
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by MoepMeep View Post
Und wo ist die Überprüfung ob das Array überhaupt 2 Elemente hat?
die erwähne ich in meiner ersten antwort:
Quote:
ist ungetestet und hat vllt nen paar kleinere häkelchen, z.b. dass in dem array mindestens 2 elemente drin sein müssen,
genauso, wie das min initialisierungsproblem, das hätte der te ja auch selbst hinkriegen können, habs ja erwähnt...
das mit dem fehlenden copy war natürlich my fault, war aber auch nur in 1 min so hingerotzt
Dr. Coxxy is offline  
Old 04/22/2012, 15:11   #13
 
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,345
Warum muss eigentlich jeder Thread hier in einen Penisvergleich degenerieren? :|
ms​ is offline  
Old 04/22/2012, 15:14   #14
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
ist halt ein forum, da passiert das (leider?).

immerhin hat man verschiedene meinungen und lernt idr. was dabei, auch wenn mans nicht immer zugeben will
Dr. Coxxy is offline  
Old 04/22/2012, 15:54   #15


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
Originally Posted by Metin2Spieler97 View Post
Es gibt immer n * (n - 1) Durchläufe. Deine While-Schleife läuft immer n-Mal und deine innere For-Schleife (n-1)-Mal.
Dein Algorithmus bricht nicht ab wenn es bei einem Durchlauf keine Vertauschungen gab, deswegen ist die Anzahl immer gleich.
Nein, das gilt für das O-Kalkül, aber da werden Elementarschritte wie Vergleiche etc. vernachlässigt und nur Schleifendurchläufe betrachtet.
MrSm!th is offline  
Reply




All times are GMT +1. The time now is 23:14.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.