의 당신은 데이터의 배열이 있다고 가정 해 봅시다, 당신은 그 중간 찾을 싶습니다과 같이
double data[MAX_DATA] = ...
인덱스의 배열을 만들고, 그리고 자신의 위치에 각각의 인덱스를 초기화 :
그들의 위치에 항상 남아있는 일부 요소 어레이에서의 위치가 다른 장소로 이동하는 대신, 비 변형 배열의 중간의 위치를 생성 할 것이다 수정 알고리즘.
C++에서 대신 인덱스의 포인터로이를 구현 할 수 있으며, 다음과 같이 포인터의 컨테이너에 std::nth_element
를 사용
여기
vector<int> data = {1, 5, 2, 20, 10, 7, 9, 1000};
vector<const int*> ptr(data.size());
transform(data.begin(), data.end(), ptr.begin(), [](const int& d) {return &d;});
auto mid = next(ptr.begin(), data.size()/2);
nth_element(ptr.begin(), mid, ptr.end(), [](const int* lhs, const int* rhs) {return *lhs < *rhs;});
ptrdiff_t pos = *mid - &data[0];
cout << pos << endl << data[pos] << endl;
가 link to a demo on ideone이다.
중간 값은 입력에있을 필요는 없습니다. 예 : [1, 1, 2, 10]의 중앙값은 1.5 – leemes
입니다. 명확해야 : 목록을 수정하지 않고 O (n)의 중앙값을 찾고 싶습니까? 사본을 만들 수 없습니까? – leonbloy
@leonbloy (오른쪽, 무시 ...) –