2011-01-25 13 views
6

Estoy tratando de obtener el ejemplo de ordenamiento de radix en contexto desde In-Place Radix Sort en funcionamiento. Hasta ahora tengo esto:Ordenación de radix en el lugar en el lenguaje de programación 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]); 
    } 
} 

Sin embargo, esto no funciona con:

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 

Bajo el v1.066 Marte digital D compilador. Supongo que las rebanadas no son mutables, pero ... ¿cómo debo arreglar esto?

Soy nuevo en D y, en gran medida, me interesa que este ejemplo funcione.

Respuesta

7

Solo necesita ref si desea modificar la referencia. Para una matriz, eso significa cambiar la longitud o reasignar. Dado que su ordenamiento radix está en su lugar, no estoy seguro de por qué querría eso.

+0

ah, ya veo. Me confundí a mí mismo. Gracias, funciona ahora! – new299

Cuestiones relacionadas