2017-05-04 7 views
-1

내가 뭘하려는 건 배열에서 다음 작은 번호를 찾기 위해 minButGreaterThan 함수를 사용하는 간단한 선택 정렬 알고리즘을 구현하는 것입니다. 내 문제는 배열에 중복 된 숫자가있는 경우 끝에 전달되고 끝에 남습니다. 이 문제를 해결하기 위해 if 문을 변경하려고 시도했지만 아무 것도 작동하지 않는 것 같습니다. 어떤 충고?선택 정렬 중복 번호를 catch하지 않습니다

double GradeBook::minButGreaterThan(double x) // - NEEDS TESTING 
    { 
     double minButGreaterThan = -1; 
     for (int i = 0; i < classSize; i++) 
     { 
      if (grades[i] > x) 
      { 
       minButGreaterThan = grades[i]; 
       break; 
      } 
     } 
     for (int i = 0; i < classSize; i++) 
     { 
      if (grades[i] > x && grades[i] <= minButGreaterThan) 
       minButGreaterThan = grades[i]; 
     } 

     return minButGreaterThan; 
    } 

void GradeBook::selectionSort() //ascending order -- *DOES NOT WORK WITH DUPLICATE SCORES* - RETEST 
{ 
    double min = absoluteMin(); 
    for (int i = 0; i < classSize; i++) 
    { 
     if (grades[i] == min) 
     { 
      double temp = grades[0]; 
      grades[0] = grades[i]; 
      grades[i] = temp; 
      break; 
     } 
    } 

    for (int i = 0; i < classSize-1; i++) 
    { 
     double next = minButGreaterThan(grades[i]); 
     for (int n = 1; n <= classSize; n++) 
      if (grades[n] == next) 
      { 
       double temp = grades[n]; 
       grades[n] = grades[i+1]; 
       grades[i+1] = temp; 
      } 
    } 

} 
+0

이것은 codereview.stackexchange.com –

답변

0

중복을 사용하여 작업해야합니다. 선택 정렬은 최소로 취해 배열의 "정렬 된"부분으로 왼쪽으로 이동합니다. 당신은 수레와 함께 작동하도록 수정해야 할 수도 있습니다

#include <algorithm> 
#include <vector> 

using std::swap; 
using std::vector; 
using std::min_element; 

void selectionSort(vector<int> &v) { 
    for (unsigned int i = 0; i < v.size() - 1; i++) { 
     auto minElement = min_element(v.begin() + i, v.end()); 
     auto minIndex = minElement - v.begin(); 
     swap(v[i], v[minIndex]); 
    } 
} 

:

내 구현입니다. 이제 이중 부동 정밀도 ( double)가 너무 많이 보인다. 보통 float은 괜찮다고 생각합니다.

+0

에 적합 할 수 있습니다. 주어진 함수 minButGreaterThan을 사용하려면 필요하지만 도움이되지 않는 입력에 대해 감사드립니다. –