2016-06-05 2 views
0

사용자 입력 값을 기수 정렬 알고리즘의 매개 변수로 전달하는 방법을 이해하는 데 문제가 있습니다.기수 정렬 알고리즘의 어려움

enter image description here

는 내 할당 클래스 다이어그램이 여기에 표시됩니다. 보시다시피 클래스 생성자 RadixSort는 (int radix) 및 (int exponent)를 가져와야합니다. "기수"변수는 수치 기반 (즉, 자료 10)으로 사용되며 "지수"는 모든 입력 수치를 정렬하는 데 사용됩니다.

내 코드는 하나의 문제를 제외하고는 완벽하게 작동합니다. 기수를 직접 입력 할 때만 작동합니다. 여기에 중요한 내 코드의 일부입니다 : 내가 생각 해요

int count[10] = { 0 };

복용 할 수 있도록 : 나는 무엇을 말할 수에서

RadixSort(int radix, int exponent): SortRoutine() { 
cout << "Radix: " << radix << endl; 
cout << "Exponent: " << exponent << endl; 
setRadix(radix); 
setExponent(exponent); 
} 

void sort(int array[], int size) { 
    cout << "-Initiating Radix Sort-" << endl; 
    setSize(size); 

    int max = getMax(array, size); 
    int radix = getRadix(); 
    int * output = new int[size]; 

    for (int exponent = getExponent(); max/exponent > 0; exponent *= radix) { 
     radixAlgorithm(array, size, radix, exponent, output); 
    } 
} 

void radixAlgorithm(int array[], int size, int radix, int exponent, int output[]) { 

    int i; 
    int count[10] = { 0 }; 

    for (i = 0; i < size; i++) 
     count[(array[i]/exponent) % radix]++; 

    for (i = 1; i < radix; i++) { 
     count[i] += count[i - 1]; 
    } 

    for (i = size - 1; i >= 0; i--) { 
     output[count[(array[i]/exponent) % radix] - 1] = array[i]; 
     count[(array[i]/exponent) % radix]--; 
    } 

    for (i = 0; i < size; i++) 
     array[i] = output[i]; 

    for (i = 0; i < size; i++) { 
     cout << array[i] << " "; 
    } 
    cout << endl; 
} 

일들이 radixAlgorithm 섹션에 잘못된 시작 갈 곳이있다 사용자 입력에서 기수. 나는이에 그것을 만드는, 그렇게하려고한다면, : 기수가 일정하므로 사용자 입력, 그리고 있어야하기 때문에

array type 'int[radix]' is not assignable.

expression did not evaluate to a constant.

, 내가 해달라고 :

int count[radix] = { 0 };

나는이 오류 기수를 count [] 배열의 기본으로 사용할 수있는 방법을 이해하십시오.

더 좋은 방법이 있나요? 너무 복잡하게 만들었나요? 나는 형식을 사용하도록 강요당하는 다른 방법으로 기수 정렬을 수행하는 방법을 이해하지 못합니다.

생성자에 대해 설명합니다.

조언이나 개선 된 방법이 있습니까?

+2

['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector)를 사용 해본 적이 있습니까? –

답변

0
이미 런타임에만 알려진 크기의 배열을 할당 할
int * output = new int[size]; 

을 사용하고

. 이해한다면 동일한 방법을 사용하여 동일한 방법으로 작동하는 int * count을 할당 할 수 있습니다. 완료되면 자신을 0으로 초기화하고 delete [] 배열을 초기화해야합니다.


패트릭 로버츠는 의견에 제안 당신은 대신 std::vector을 사용할 수 있습니다, 이것은 C++에서 그것을 할 수있는 더 적절한 방법이며,이 범위를 벗어나면 그 자체를 할당 해제의 혜택이 있습니다

std::vector<int> count(radix, 0); 

int count[radix]는 (Why aren't variable-length arrays part of the C++ standard? 참조) C++ 최신 버전의 존재가 아니라 C 인 가변 길이 배열이다.

+0

이것은 매우 잘 작동했는데 왜 내가 전에 이미 해본 적이 있는지 알 수 없었습니다. 도와 주셔서 감사합니다. – xChaos