Autor Beitrag
adfontes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 82

Win7 (64bit), WinXP
Delphi 2010 Prof, Delphi XE2 (Trial)
BeitragVerfasst: Do 02.03.06 22:43 
Guten Abend,

Ich habe mich heute an QuickSort versucht, nur leider kommt da nichts brauchbares raus, sondern er überschreibt einfach alles mit einem element (in dem fall dem letzten) ... ich finde aber einfach nicht warum... bzw. ich schätze mal es liegt an dem Reset, aber wenn ich das rausnehmen, will er von dem 0. element noch einmal -1 rechnen und dann landet er im Nichts, folglich kommt ein Error und sonst nichts mehr.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
procedure TForm2.sort_AName(var l,r:integer);
var mpos,lpos,rpos :integer;
    Buch_l,Buch_r,Buch_m : Book;
begin
  AssignFile(DATEI_B,'C:\Buecher.dat');
  Reset(DATEI_B);
  mpos:=(l+r) div 2;
  seek(DATEI_B,mpos);
  Read(DATEI_B,Buch_m);
  lpos:=l;
  rpos:=r;

  while lpos<=rpos do
    begin
      seek(DATEI_B, lpos);
      Read(DATEI_B,Buch_l);
      seek(DATEI_B, rpos);
      Read(DATEI_B,Buch_r);
      while Buch_l.AName<Buch_m.AName do
      begin
        inc(lpos);
        seek(DATEI_B, lpos);
        Read(DATEI_B,Buch_l);
      end;
      while Buch_r.AName>Buch_m.AName do
      begin
        dec(rpos);
        seek(DATEI_B, rpos);
        Read(DATEI_B,Buch_r);
      end;
      if lpos<=rpos then
        begin
          showmessage('rpos: '+IntToStr(rpos)+' und -1 '+IntToStr(rpos-1));
          showmessage('lpos: '+IntToStr(lpos)+' und -1 '+IntToStr(lpos-1));
          if (lpos=0then
            Reset(DATEI_B)
          else
            seek(DATEI_B,(lpos-1));
          write(DATEI_B,Buch_r);
          seek(DATEI_B,(rpos-1));
          write(DATEI_B,Buch_l);
          inc(lpos);
          dec(rpos);
        end;
    end;
  if l<rpos then sort_AName(l,rpos);
  if lpos<r then sort_AName(lpos,r);
end;


Könnte bitte mal jemand drübergucken und eventuell mir einen Tipp geben wo der Fehler liegt, ich verzweifle hier noch :(

adfontes


Moderiert von user profile iconChristian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 02.03.2006 um 21:54

// Edit: Sorry fürs posten in die falsche Kategorie :(
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 02.03.06 23:33 
wieso willst du denn den Q-Sort auf eine Datei anwenden? der ist doch vollkommen ungeeignet, da es sich um einen algo handelt der im memory ganz fein funktioniert aber auf datenträger kannst ihn vergessen. da gibts bessere algos.

dies nur mal so als anmerkung.

PS: der q-sort ist ein rekursiver algo. mann kann ihn auch iterativ hinbekommen. ist aber nicht seine natur....
adfontes Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 82

Win7 (64bit), WinXP
Delphi 2010 Prof, Delphi XE2 (Trial)
BeitragVerfasst: Do 02.03.06 23:41 
welchen würdest du (oder auch sonst wer) mir denn empfehlen... ich wäre ja für alles dankbar, nur ich habe halt quicksort genommen, weil ich den im ansatz schon mal benutzt hatte, nur mit arrays ist das wesentlich einfacher als mit files :/


adfontes


//Edit: Zu der Frage wieso: Weil ich die Datei gern sortiert hätte um Sie dann geordnet auslesen zu können und nicht jedes mal neu sortieren zu müssen.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 02.03.06 23:51 
kannst mal schaun unter: www.informatik.uni-b...n/roubinchtein_f.pdf allgemeine algos währen:
- Externes Sortieren
- Sortieren-Mischen
- Ausgeglichenes Mehrweg-Mischen
- Replacement Selection.

oder weshalb hast du das externe sortieren gewählt? nur just for fun, oder wegen anderer gründe? bei just for fun, überleg es dir, nicht die ganze datei in den speicher (heap) einzulesen, da den quicky (rekursiv) drauf und das ganze wieder komplett abzuspeichern. da findest du auch genug hier im forum. bei den externen varianten, wirds recht dünn.

viel erfolg.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 03.03.06 00:54 
Moin!

Darf ich mal einen neuen Aspekt in die Diskussion werfen... ? :wink:

user profile iconadfontes hat folgendes geschrieben:
Zu der Frage wieso: Weil ich die Datei gern sortiert hätte um Sie dann geordnet auslesen zu können und nicht jedes mal neu sortieren zu müssen.

Spielt denn die physikalische Reihenfolge auf dem Datenträger wirklich eine Rolle? :gruebel:

Sonst mach´s doch wie bei einer Datenbank: bau dir eine Indextabelle, die nur das Sortierkriterium und die Dateiposition enthält. Diese sortiertst du (und hältst das Ding möglichst komplett im Speicher) und verwendest es zum Umschlüsseln von Index in die Tabelle (Sortierreihenfolge) zu physikalischer Reihenfolge auf dem Datenträger.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 04.03.06 15:55 
also aus praktischen erwägungen. wie wäre es, wenn du sie einfach in eine datenbank einliesst (M$-Access, etc) und du dann einfach darauf per SQL zugreifst? die datenbanktreiber kannst ja einbinden in deine anwendung. glaub per firebird sollt dies funktionieren. denke dies wär das einfachste. eine andere möglichkeit wär die datei in XML umzuwandeln und via den parser darauf zuzugreifen...

viel erfolg.
adfontes Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 82

Win7 (64bit), WinXP
Delphi 2010 Prof, Delphi XE2 (Trial)
BeitragVerfasst: So 05.03.06 19:39 
Habe mich mittlerweile anders orientiert als alles einzeln in den files selbst zu sortieren. Die *.sorted option hat mir eine menge aufwand erspart :)

Nun ergibt sich aber wiedermal ein neues Problem, das werde ich aber dann in einem neuen Thread aufgreifen.

Danke erst mal soweit an alle, die sich Gedanken zu dem Thema gemacht haben.


greetz
adfontes