Avatar billede onkel_satan Nybegynder
03. oktober 2004 - 22:25 Der er 5 kommentarer og
1 løsning

quicksort linked list ?

hejsa!
Har fået til opgave (i skolen) at lave en quicksort algoritme som kunne sortere et array. Dette var ikke så vanskeligt, men så bliver jeg bedt om at få den til at virke på linked list også.
Jeg har ingen anelse om hvordan jeg skal starte da jeg ikke længere kan tilgå de elementerne direkte.
Eneste metode jeg kan kom i tanke om er at kopiere pointerne over i et array og så bare lave min swap funktion til håndtere struktuere istedet for int's. Men så er der jo ikke rigtig længere nogen fidus i quicksort.

Min quicksort ser således ud:

void quickSort(int a[], int left, int right){
    int pivot, p_left, p_right, i, p_pos;
    void swap(int a[], int x, int y);

    if(left >= right) return;

    pivot = a[left];
    p_pos = left;

    for(i=left; i<=right; i++){
        if(a[i]< pivot){
            p_pos++;
            if(p_pos != i)swap(a, p_pos, i);
        }
    }
    swap(a, left, p_pos);
   
    quickSort(a, left, p_pos-1);
    quickSort(a, p_pos+1, right);

}

Nogen foreslag til hvor man kan gribe det an ?
Avatar billede arne_v Ekspert
03. oktober 2004 - 22:33 #1
Altså grundliggende egner linked list sig ikke til quicksort.

Men dit approach er OK.

linked list -> array er O(n)
quicksort er O(nlogn)

altså er linked list->array + quicksort + array->linked list også O(nlogn)
Avatar billede bertelbrander Novice
03. oktober 2004 - 22:39 #2
En anden metode er at tage elementerne fra listen ud en efter en og putte dem ind i en ny liste, sorteret.
Avatar billede onkel_satan Nybegynder
03. oktober 2004 - 22:49 #3
ok vil prøve at med arrayet så.
Avatar billede erikjacobsen Ekspert
03. oktober 2004 - 22:51 #4
Det er ikke så traditionelt at bruge linkede lister, men man kan godt.

1) Du skal sørge for at du i dine linkede lister kan tilgå både første
  og sidste element direkte, så du nemt kan indsætte for enden af listen.
  Du skal også umiddelbart kende længden, uden at løbe listen igennem.

2) Først trin er det samme som med array. Hvis listen er på 0 eller 1 element,
  så er den sorteret.

3) Hvis der er 2 eller flere skal du nu vælge et pivotelement. Er listen helt
  usorteret, er det altid fint nok at bruge det første element, så da det
  er en skoleopgave, så siger vi bare det...

4) Lav 3 lister. Een liste til elementer mindre end pivot. Een liste tli dem,
  der er lig med pivot, og een liste til dem der er større.
  Løb din liste igennem og læg elemeterne i de rigtige af de 3 lister. I dette
  trin kan du sætte dem ind forrest, og ikke nødvendigvis bagerst,
  da de i forvejen ikke er sortede.

5) Kald rekursivt på første og sidste liste, men ikke listen med pivot-elementer.

6) Når de to kald er færdige, skal du sammensætte de 3 lister tli een, og
  her kommer det dig til gode at du kende slutelementer i alle 3 lister.
  Resultatet af sammensætningen afleveres som resultat.

(ja, det er mest en skitse, men du udfylder selv detaljerne ... )
Avatar billede onkel_satan Nybegynder
03. oktober 2004 - 23:01 #5
Ok takker.. jeg kigger lidt på det.
Avatar billede onkel_satan Nybegynder
23. september 2006 - 18:17 #6
lukker
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