Avatar billede zerohero Nybegynder
27. juni 2001 - 01:43 Der er 9 kommentarer og
2 løsninger

sortering af arrays

Jeg har 2 arrays hvor af list1 er sorteret af B (1, 2, 3, 4) mens A er usorteret.
Nu mangler jeg bare et eller andet kode der kan sortere list2 sådan
at A er sorteret (0.3, 0.7, 1.1, 1.5) og B er usorteret (2, 4, 3, 1).

type
  Tab = record
    A, B : single;
  end;

var
list1 : array of Tab;
list2 : array of Tab;
begin
setlength(list1, 4);
list1[0].A := 1.5; list1[0].B := 1;
list1[1].A := 0.3; list1[1].B := 2;
list1[2].A := 1.1; list1[2].B := 3;
list1[3].A := 0.7; list1[3].B := 4;

// på en eller anden måde skal list1 sorters af A mens B er usorteret
// så der kommer til at stå følgende i list2:
// 0.3 = list2[0].A & 2 = list2[0].B
// 0.7 = list2[1].A & 4 = list2[1].B
// 1.1 = list2[2].A & 3 = list2[2].B
// 1.5 = list2[3].A & 1 = list2[3].B

end;

ZeroHero
Avatar billede pstric Nybegynder
27. juni 2001 - 07:04 #1
Hvis list2 allerede er en kopi af den sorterede list1, så brug en lille bubblesort:

var
  Temp: Tab;
  ...

for I:=0 to 2 do
begin
  for J:=I to 3 do
  begin
    if list2[I].A > list2[j].A then
    begin
      Temp:=list2[I];
      list2[I]:=list2[J];
      list2[J]:=Temp;
    end;
  end;
end;
Avatar billede seider Nybegynder
27. juni 2001 - 07:13 #2
en meget simpel sortering i delphi\'sk

d:integer;
z:single;
A:array [0..list1.elements] of boolean;
z := list1[0].a;

for d = 0 to list1.elments do a[d] =true

for I = 0 to list1.elements do //antal elementer
  begin
    for y = 0 to list1.elements do //antal elementer
    begin
      if (list1[y].a < z) and (a[y]) then
      begin
        z = list1[y].a;
        d: = Y;
      end;
    end;
  end;
  list2[i].a := list1[d].a;
  list2[i].b := list1[d].b,
  a[d] := false;
end;
Avatar billede seider Nybegynder
27. juni 2001 - 07:20 #3
burde den gode peter ikke sove ?

min antager at liste 2 er tom, og at det faktisk er sådan man heter antalet af elementer fra listen.

www.fotx.net/seider
Avatar billede pstric Nybegynder
27. juni 2001 - 07:27 #4
Nej, den gode Peter burde faktisk skynde sig på arbejde.

Dit forslag om at sove lyder ellers mere tillokkende ;-)
Avatar billede seider Nybegynder
27. juni 2001 - 07:29 #5
he he, vi ses den 13 Aug. *S*
Avatar billede martinlind Nybegynder
27. juni 2001 - 09:28 #6
Prøv at kigge lidt på Demos\\Threads der er tre forskellige sort func. bla. QuikSort, som nok er den du skal vælge da bouble sort er HÅBLØST langsomt.

/Martin
Avatar billede borrisholt Novice
27. juni 2001 - 09:46 #7
ZeroHero >> Du skriver dig en QuickSord der kan sortere dit array :

procedure QuickSort(var A: array of Tab);
  procedure Sort(var A: array of Tab; iLo, iHi: Integer);
    var
      Lo, Hi : Integer;
      Mid : Double;
      T: Tab;
    begin
      Lo := iLo;
      Hi := iHi;
      Mid := A[(Lo + Hi) div 2].A;
      repeat
        while A[Lo].A < Mid do Inc(Lo);
        while A[Hi].A > Mid do Dec(Hi);
        if Lo <= Hi then
        begin
          T := A[Lo];
          A[Lo] := A[Hi];
          A[Hi] := T;
          Inc(Lo);
          Dec(Hi);
        end;
      until Lo > Hi;
      if Hi > iLo then Sort(A, iLo, Hi);
      if Lo < iHi then Sort(A, Lo, iHi);
    end;
begin
  Sort(A, Low(A), High(A));
end;


Jens B http://fotx.net/borrisholt
Avatar billede martinlind Nybegynder
27. juni 2001 - 10:17 #8
Eller også \"sakser\" du delphi\'s eks. det funker fint ( så er du også fri for at opfinde den dybe talerken igen )
Avatar billede borrisholt Novice
27. juni 2001 - 10:19 #9
martinlind>> Jeg har \"sakset\" borlands QuickSort ....

Jens B
Avatar billede martinlind Nybegynder
27. juni 2001 - 10:24 #10
JB >> Ok :)
Avatar billede zerohero Nybegynder
27. juni 2001 - 23:14 #11
1000 tak for jeres gode forslag

ZeroHero
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester