2011-01-25 20 views
6

インプレース基数ソートの例をIn-Place Radix Sortから取得しようとしています。これまでのところ私はこれを持っている:デジタル火星Dコンパイラv1.066の下Dプログラミング言語のインプレース基数ソート

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 

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]); 
    } 
} 

はしかし、これは失敗します。私はスライスが変更可能ではないと思うが、どうすればこの問題を修正するべきだろうか?

私はDが新しく、主にこのサンプルを動作させることに興味があります。

答えて

7

参照自体を変更する場合は、refが必要です。配列の場合は、長さを変更するか、または再割り当てすることを意味します。あなたの基数ソートがインプレースであるので、なぜそれを望むのか分かりません。

+0

ああそうです。私は自分自身を混乱させた。ありがとうございました! – new299

関連する問題