2011-01-25 7 views
6

मैं In-Place Radix Sort से इन-प्लेस रेडिक्स सॉर्ट उदाहरण प्राप्त करने का प्रयास कर रहा हूं। अब तक मैं इस राशि: डिजिटल मंगल ग्रह डी संकलक v1.066 तहतडी-प्रोग्रामिंग भाषा में इन-प्लेस रेडिक्स सॉर्ट

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

हालांकि, इस के साथ विफल रहता है। मुझे लगता है कि स्लाइस म्यूटेबल नहीं हैं, लेकिन ... मुझे इसे ठीक करने के बारे में कैसे जाना चाहिए?

मैं डी के लिए नया हूं और काफी हद तक इस उदाहरण को काम करने में दिलचस्पी है।

उत्तर

7

यदि आप संदर्भ को संशोधित करना चाहते हैं तो आपको केवल ref की आवश्यकता है। एक सरणी के लिए, इसका अर्थ है लंबाई या फिर से स्थानांतरित करना। चूंकि आपका रेडिक्स सॉर्ट जगह में है, मुझे यकीन नहीं है कि आप इसे क्यों चाहते हैं।

+0

आह मैं देखता हूं। मैं खुद को भ्रमित कर दूंगा। धन्यवाद यह अब काम करता है! – new299

संबंधित मुद्दे