2011-01-25 9 views
6

Próbuję uzyskać przykład sortowania radix w miejscu z In-Place Radix Sort działa. Do tej pory mam to:Sortowanie radix w miejscu w języku programowania D

import std.random; 

void swap(ref string i,ref string j) { 

    string tmp = i; 
    i = j; 
    j = tmp; 
} 

void radixSort(ref string[] seqs, size_t base = 0) { 
    if(seqs.length == 0) 
     return; 

    size_t TPos = seqs.length, APos = 0; 
    size_t i = 0; 
    while(i < TPos) { 
     if(seqs[i][base] == 'A') { 
      swap(seqs[i], seqs[APos++]); 
      i++; 
     } 
     else if(seqs[i][base] == 'T') { 
      swap(seqs[i], seqs[--TPos]); 
     } else i++; 
    } 

    i = APos; 
    size_t CPos = APos; 
    while(i < TPos) { 
     if(seqs[i][base] == 'C') { 
      swap(seqs[i], seqs[CPos++]); 
     } 
     i++; 
    } 
    if(base < seqs[0].length - 1) { 
     radixSort(seqs[0..APos], base + 1); 
     radixSort(seqs[APos..CPos], base + 1); 
     radixSort(seqs[CPos..TPos], base + 1); 
     radixSort(seqs[TPos..seqs.length], base + 1); 
    } 
} 

void main(string[] args) { 

    string [] sequences; 

    for(int n=0;n<10;n++) { 
    string seq; 
    for(int i=0;i<10;i++) { 
     int r = rand()%4; 
     if(r == 0) seq = seq ~ "A"; 
     if(r == 1) seq = seq ~ "C"; 
     if(r == 2) seq = seq ~ "G"; 
     if(r == 3) seq = seq ~ "T"; 
    } 
    sequences = sequences ~ seq; 
    } 

    writefln("Unsorted"); 
    for(size_t n=0;n<10;n++) { 
    writefln(sequences[n]); 
    } 

    radixSort(sequences,0); 

    writefln("Sorted"); 
    for(size_t n=0;n<10;n++) { 
    writefln(sequences[n]); 
    } 
} 

Jednak to nie powiedzie się z:

radix.d(36): Error: slice expression seqs[0u..APos] is not a modifiable lvalue 
radix.d(37): Error: slice expression seqs[APos..CPos] is not a modifiable lvalue 
radix.d(38): Error: slice expression seqs[CPos..TPos] is not a modifiable lvalue 
radix.d(39): Error: slice expression seqs[TPos..seqs.length] is not a modifiable lvalue 

Pod v1.066 Cyfrowy Mars D kompilator. Chyba plasterki nie są zmienne, ale ... jak mam to naprawić?

Jestem nowy w D i głównie interesuje mnie tylko ten przykład.

Odpowiedz

7

Potrzebujesz tylko ref, jeśli chcesz zmodyfikować samą referencję. W przypadku tablicy oznacza to zmianę długości lub ponowne przydzielenie. Ponieważ sortowanie radix jest na miejscu, nie jestem pewien, dlaczego tego chcesz.

+0

ah Widzę. Pomyślałem sobie. Dzięki to działa teraz! – new299

Powiązane problemy