/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
hjælp til sorterings algoritmer
Fra : steen svensson


Dato : 06-10-01 15:47

jeg er stødt på et lille problem, jeg kan ikke helt finde ud af java.. jeg
skulle implementerere en "Insertionsort" på en simpel hægtede liste... og
jeg ved kun hvordan man gør det på et array.. der skulle vel ikke være nogen
der kunne hjælpe mig med problemet.

på arrayet ser det sådan ud:

public void sort()
{
int j, temp;

for (int i = 1; i < tal.length; i++)
{
if (tal[ i ] < tal[ i-1 ])
{
temp = tal[ i ];
for (j = i; j >0 && temp < tal[ j-1 ]; j--)
tal[ j ] =temp;
}
}
}




 
 
Ulrik Magnusson (06-10-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 06-10-01 18:34

steen svensson wrote:

> jeg er stødt på et lille problem, jeg kan ikke helt finde ud af java.. jeg
> skulle implementerere en "Insertionsort" på en simpel hægtede liste... og
> jeg ved kun hvordan man gør det på et array.. der skulle vel ikke være nogen
> der kunne hjælpe mig med problemet.
>
> på arrayet ser det sådan ud:
>
> public void sort()
> {
> int j, temp;
>
> for (int i = 1; i < tal.length; i++)
> {
> if (tal[ i ] < tal[ i-1 ])
> {
> temp = tal[ i ];
> for (j = i; j >0 && temp < tal[ j-1 ]; j--)
> tal[ j ] =temp;
> }
> }
> }

du kan vel bare udskifte tildeling og hentning med get() og set()
og length med size(): (ikke testet)

public void sort()
{
int j, temp;

for (int i = 1; i < tal.size(); i++)
{
if (((Integer)tal.get( i )).intValue() < ((Integer)tal.get( i-1
)).intValue())
{
temp = ((Integer)tal.get( i )).intValue();
for (j = i; j >0 && temp < ((Integer)tal.get( j-1 ).intValue());
j--)
tal.set( j , new Integer(temp) );
}
}
}

Dette er dog en afsindig brug af en hægtet liste, og et bedre
bud er nok at at konvertere listen til et array (fx med toArray())
og sortere dette. Eller, hvis du har adgang til de enkelte elementer
i listen med previous pegere, kan du udskifte get og set med
manipulation af disse - hold dog tungen lige i munden - her et
ukomplet forsøg på en illustration (sikkert overhovedet ikke korrekt):

class Node{ Node previous; Node next; int value; }

Node j;
int temp;

// list indeholder Node objekter, som findes med get(index)
for (Node i = list.get(1); i != null; i = i.next)
{
Node j, i;
if ( i.value < i.previous )
{
for (j = i; j.previous != null && temp < j.previous.value; j =
j.previous )
{
j.value = temp;
}
}
}

Ulrik Magnusson


Filip Larsen (07-10-2001)
Kommentar
Fra : Filip Larsen


Dato : 07-10-01 17:46

steen svensson skrev

> jeg er stødt på et lille problem, jeg kan ikke helt finde ud af java.. jeg
> skulle implementerere en "Insertionsort" på en simpel hægtede liste... og
> jeg ved kun hvordan man gør det på et array.. der skulle vel ikke være
nogen
> der kunne hjælpe mig med problemet.

I insertion sort indsætter man det "næste element" på den korrekte plads i
den allerede sorterede del. Hvis man bruger arrays kan man kun gøre dette
ved at skifte elementerne en plads til højre, mens man med hægtede lister
kan nøjes med at hægte elementet ind der hvor det passer. For at finde
pladsen i en enkelt-hægtet liste er søgning fra første element nødvendig (i
modsætning til array-eksemplet hvor man i stedet går baglæns).

Følgende *uafprøvet* kode skulle gerne illustrere princippet (lad nu være
med at bruge koden direkte, lav i stedet din egen version):


class Node {
int number;
Node next;
}

public Node sort(Node first)
{
Node head = new Node(); // hjælpeknude for at gøre det nemt
head.next = first; // at indsætte i starten af listen
for (Node i = first; i != null && i.next != null; i = i.next) {
Node j = i.next; // j er det element der evt. skal flyttes
if (j.number < i.number) { // kriteriet for at j skal indsættes
i.next = j.next; // hægt j ud af listen ved i
Node k = head; // find hvor j skal indsættes
while(j.number < k.next.number) k = k.next;
j.next = k.next; // indsæt j efter k
k.next = j;
}
}
return head.next;
}




Mvh,
--
Filip Larsen <filip.larsen@mail.dk>




Filip Larsen (07-10-2001)
Kommentar
Fra : Filip Larsen


Dato : 07-10-01 18:01

Filip Larsen skrev

> Følgende *uafprøvet* kode skulle gerne illustrere princippet ...

Der har (selvfølgelig af klart pædagogiske grunde :) indsneget sig mindst en
fejl i koden. Et sted skal "<" erstattes med ">=", find selv hvor.


Mvh,
--
Filip Larsen <filip.larsen@mail.dk>



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste