|
| 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>
| |
|
|