2014-11-15 4 views
3

나는 양수의리스트를 가지고 있으며, 변수 h1, h2h3에 3 개의 가장 큰 값을 저장하려고합니다. 나머지 값은 부적합합니다.여기서 정렬 알고리즘을 구현할 가치가 있습니까?

int*realloc 메모리가 채워지는대로 관리하고 적합한 정렬 알고리즘이 뒤따라야한다고 생각했지만 정말 가치가 있습니까? 그것은 그 일의 바보 같은 정적 방법 같은 느낌

if (currentVal > h3) { 
    h3 = currentVal; 
    if (currentVal > h2) { 
     h3 = h2; 
     h2 = currentVal; 
     if (currentVal > h1) { 
      h2 = h1; 
      h1 = currentVal; 
     } 
    } 
} 

,하지만 작동 : 정말 전체 배열을 정렬 할 필요가 없기 때문에, 난 그냥이 좋아하지 않았다. 대신에 정렬 알고리즘을 구현해야합니까? 그렇다면 어떤 제안이 적합할까요?

+2

있는 다음과 같은 방법으로 배열의 최대 요소의 수를 찾을 수 있습니까? –

+6

정렬 할 필요가 없습니다. 그렇게하는 것이 좋습니다. 목록이 짧으면 휠을 다시 작성하는 것보다 실제로 정렬하는 것이 더 편리합니다. – ale64bit

+0

3 개의 값만 저장하므로 정렬 오버 헤드가 코드보다 길어질 수 있습니다. 어셈블리 언어 목록을보십시오. –

답변

7

"톱 3"의 경우 매우 이상적입니다. k에 대해 더 큰 (그러나 고정 된) 값을 갖는 "톱 k"의 경우 priority queue을 사용해보십시오.

2

당신은

#include <iostream> 
#include <algorithm> 
#include <functional> 
#include <array> 

template <size_t N> 
void n_max_element(const int a[], 
        size_t n, 
        std::array<int, N> &nmax) 
{ 
    std::partial_sort_copy(a, a + n, 
          nmax.begin(), nmax.end(), 
          std::greater<int>()); 
} 

int main() 
{ 
    const size_t N = 10; 
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

    std::random_shuffle(a, a + N); 

    std::array<int, 3> max; 

    n_max_element(a, N, max); 

    std::cout << "max[0] = " << max[0] 
       << ", max[1] = " << max[1] 
       << ", max[2] = " << max[2] << std::endl; 

    return 0; 
} 

출력은`표준을 사용하여 : : 정렬()`당신을 위해 실제로 잘못 무엇

max[0] = 9, max[1] = 8, max[2] = 7 
관련 문제