Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Mein Quicksort funktioniert nicht - Bitte um Hilfe bei der Fehlersuche

Frage Entwicklung Batch & Shell

Mitglied: Leopold.Bloom

Leopold.Bloom (Level 1) - Jetzt verbinden

29.08.2012 um 02:22 Uhr, 2244 Aufrufe, 1 Kommentar

Hallo liebe Leute,

ich will mich gar nicht darüber streiten ob selbstgestrickte Arrays in Batches Sinn machen oder nicht. Letztlich ist es in anderen Programmiersprachen auch nicht anders. Es ist reservierter Speicher, dem ich Namen gebe. Sonst nichts. Eine lib stellt die Arrayfunktionen zur Verfügung. Bei mir inzwischen auch. Ich finde es praktisch, weil für mein Gefühl der Code aufgeräumter aussieht. Und es ist für mich einfacher, es vielleicht auch in eine andere Programmiersprache zu portieren oder Progs aus anderen Programmiersprachen als Batch zu realisieren. Egal. Darum geht es mir jetzt nicht.

Ich habe einen Pseudocode Quicksort umgesetzt und er funktioniert nicht. Ich finde den Fehler nicht. Vielleicht kann mir jemand auf die Sprünge helfen. Mein Bubblesort funktioniert einwandfrei. In beide Richtungen. Es liegt also nicht an den Arrayfunktionen. Kann Quicksort eigentlich auch absteigend sortieren? So ganz klar ist mir der Algorithmus noch nicht. Das Prinzip schon. Aber irgendwas fehlt mir noch.

01.
 
02.
:qsort 
03.
 
04.
Rem Ein Arrey wird übergeben und 2 Indizes 
05.
     
06.
	SET QUICK.ARRAY=%1 
07.
	SET LOW.INDEX=%2 
08.
	SET HIGH.INDEX=%3 
09.
 
10.
	SET /a i=%LOW.INDEX%  
11.
	SET /a j=%HIGH.INDEX% 
12.
 
13.
Rem Arraymitte errechnen 
14.
 
15.
	SET /a HELP=%LOW.INDEX%+%HIGH.INDEX% 
16.
	SET /a P=%HELP%/2 
17.
 
18.
Rem das PIVOT Element wird festgelegt. Mitte Array 
19.
  
20.
	setlocal enabledelayedexpansion 
21.
	   call lib getval %QUICK.ARRAY% %P% PIVOT 
22.
	endlocal & SET PIVOT=%PIVOT% 
23.
 
24.
Rem das Tauschelement von links wird gesucht 
25.
 
26.
	:LINKS_NEXT 
27.
	setlocal enabledelayedexpansion 
28.
		call lib getval %QUICK.ARRAY% %i% WERT_LINKS 
29.
	endlocal & SET WERT_LINKS=%WERT_LINKS%	 
30.
	IF %WERT_LINKS% LSS %PIVOT% ( 
31.
		set /a i+=1 
32.
		goto LINKS_NEXT 
33.
	)  
34.
 
35.
Rem das Tauschelement von rechts wird gesucht 
36.
 
37.
	:RECHTS_NEXT 
38.
	setlocal enabledelayedexpansion 
39.
		call lib getval %QUICK.ARRAY% %j% WERT_RECHTS 
40.
	endlocal & SET WERT_RECHTS=%WERT_RECHTS% 
41.
	IF %WERT_RECHTS% GTR %PIVOT% ( 
42.
		set /a j-=1 
43.
		goto RECHTS_NEXT 
44.
45.
 
46.
Rem solange der Index von links kleinergleich Index von rechts 
47.
Rem werden die Elemente getauscht 
48.
  
49.
	IF %i% LEQ %j% ( 
50.
		setlocal enabledelayedexpansion 
51.
		call lib getval !QUICK.ARRAY! %i% Z1 
52.
		call lib getval %QUICK.ARRAY% %j% Z2 
53.
		 
54.
Rem Ausgabe zu Kontrollzwecken 
55.
 
56.
		echo vorher 
57.
		ECHO %QUICK.ARRAY%[%i%]=!Z1! 
58.
		ECHO %QUICK.ARRAY%[%j%]=!Z2! 
59.
 
60.
Rem die Elemente werden getauscht 
61.
		 
62.
		SET %QUICK.ARRAY%[%i%]=!Z2! 
63.
		SET %QUICK.ARRAY%[%j%]=!Z1! 
64.
				 
65.
Rem Ausgabe zu Kontrollzwecken 
66.
 
67.
                call lib getval !QUICK.ARRAY! %i% Z1 
68.
		call lib getval %QUICK.ARRAY% %j% Z2  
69.
		 
70.
		ECHO nachher 
71.
		ECHO %QUICK.ARRAY%[%i%]=!Z1! 
72.
		ECHO %QUICK.ARRAY%[%j%]=!Z2! 
73.
 
74.
 
75.
Rem Ausgabe gesamtes Array um zu sehen ob der Tausch funktioniert   
76.
Rem hat		 
77.
		FOR /L %%l IN (0, 1, 8 ) Do ( 
78.
		call lib getval %QUICK.ARRAY% %%l Z0 
79.
		Echo !QUICK.ARRAY![%%l] !Z0! 
80.
81.
		PAUSE 			 
82.
		endlocal 
83.
 
84.
Rem die Indizes werden hoch bzw. runter gezählt 
85.
		 
86.
		set /a i+=1 
87.
		set /a j-=1 
88.
89.
 
90.
Rem falls der linke Index am rechten vorbei ist Abbruch	 
91.
	 
92.
if %i% gtr %j% goto WEITER 
93.
	goto :LINKS_NEXT 
94.
		 
95.
:WEITER 
96.
 
97.
Rem Die Rekursion 
98.
 
99.
IF %LOW.INDEX% LSS %j% call :qsort %QUICK.ARRAY% %LOW.INDEX% %j% 
100.
IF %i% LSS %HIGH.INDEX% call :qsort %j% %QUICK.ARRAY% %HIGH.INDEX%  
101.
 
102.
Rem Zum Schluss Ausgabe des sortierten Arrays auf dem Bildschirm 
103.
 
104.
setlocal enabledelayedexpansion 
105.
FOR /L %%l IN (0, 1, 8 ) Do ( 
106.
	call lib getval %QUICK.ARRAY% %%l Z0 
107.
	Echo !QUICK.ARRAY![%%l] !Z0! 
108.
109.
endlocal	 
110.
 
111.
ECHO FERTIG	 
112.
goto :eof 
113.
 
Irgendwas fehlt mir - aber was? Das Pivotelement wird richtig gesetzt, die ersten Tauschaktionen laufen richtig. Aber dann wird nicht weitersortiert. Die Gotos habe ich eingebaut, nachdem ich verzweifelt versucht habe eine Endlosschleife zu konstruieren.

01.
set /a j=0 
02.
for /L %%i in (0) do if not defined done ( 
03.
    set j+=1  
04.
    echo Hallo %j%  
05.
  if %j%==10 set done=break 
06.
)
geht nicht. der Job bleibt bei meinem CMD stehen. Bei


01.
 for /L %%i in (0,0,0) do if not defined done ( 

auch. Das hier geht auch nicht

01.
 
02.
set /a j=0 
03.
set /a x=1 
04.
for /L %%i in (0,1,%x%) do if not defined done ( 
05.
    set j+=1 
06.
    set x+=1   
07.
    echo Hallo %j%  
08.
  if %j%==10 set done=break 
09.
)
Ich habe hier gelegentlich auch

01.
 for /L %i in (0,1,%x%) do 
gesehen. Da bekomme ich auch eine Fehlermeldung. Die Zählvariable muss zwei Prozentzeichen haben und ich kann ihr auch keinen Wert zuweisen.

Also doch zwei Fragen.

1. Was ist bei meinem qsort falsch?
2. Gibt es eine andere Möglichkeit, eine Endlosschleife zu bauen?

Vielen Dank für Euer Interesse

LG

Leo





Mitglied: jeb-the-batcher
29.08.2012 um 15:26 Uhr
Hallo Leo,

dann möchte ich mich mal über Endlosschleifen auslassen.
Wie der Name schon sagt sind diese endlos, und Batch nimmt es hier sehr genau mit dem Endlos.
Mit einem goto oder exit /b kann zwar das weitere Ausführen der Scheife beendet werden, aber nicht die Schleife selbst!

Siehe ein kleines Beispiel
01.
@echo off 
02.
setlocal EnableDelayedExpansion 
03.
set /a cnt=0 
04.
for /L %%n in (0) DO ( 
05.
  set /a cnt+=1 
06.
  echo !cnt! 
07.
  if !cnt!==5 goto :myExit 
08.
09.
:myExit
Wie wir sehen werden die Zahlen von 1 bis 5 ausgegeben, aber danach hängt die Batch.
Interessant wird es wenn man ECHO ON zu beginn schaltet, dann sieht man das der Abbruch leider die Schleife nicht abbricht, sie wird weiter aufgelöst aber nicht mehr ausgeführt.
Dies gilt übrigens nur für FOR /L, bei den anderen FOR Schleifen ist ein vorzeitiger Abbruch möglich.

Allerdings soll nicht verschwiegen werden, es ist auch mit FOR /L möglich, man braucht nur mit EXIT die Schleife zu beenden.
Dadruch sind aber etwas komplexere Konstrukte notwendig, wenn man danach noch weiterarbeiten möchte.
Dazu gibt es einen schönen Thread auf Dostips.com The ultimate while loop

Zu deiner ersten Frage: Was ist bei meinem qsort falsch?
Ja, das wüsste ich auch gerne, aber da wird wohl noch jemand eine gute Lösung finden ...

Gruß
jeb
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Linux
LTSP: PXE Boot funktioniert nicht (16)

Frage von Fenris14 zum Thema Linux ...

Virtualisierung
Drucker aus einer VM heraus funktioniert nicht (5)

Frage von NCCTech zum Thema Virtualisierung ...

LAN, WAN, Wireless
gelöst Netzwerk funktioniert nur in eine Richtung mit Gigabit (28)

Frage von DrChiwago zum Thema LAN, WAN, Wireless ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...