2015-05-22 3 views
1

Задача состоит в том, чтобы частично отсортировать вектор с дубликатами s.t. медиана (n-й элемент) находится в положении, которое было бы, если бы вектор был отсортирован. Все меньшие элементы должны быть слева, все более крупные элементы справа. Все элементы со значениями, такими же, как медианные, должны быть в исходном порядке, но только эти не остальные элементы.Частичная сортировка: n-ые элементы, имеющие заданный порядок

Как бы вы это разрешили?

Мое начальное решение:

  1. Использование станд :: nth_element(), чтобы найти медиану элемент
  2. траверс вектор и сортировать только элементы с одинаковым значением в среднем по отношению к их индексу. Как я могу сделать это эффективно?
+0

В чем проблема с вашим текущим решением? – kraskevich

+0

Я ищу очень эффективное решение - особенно часть 2: сортировка только определенных значений вектора по их индексам. – aces

+1

Как вы определяете «исходный порядок», когда элементы имеют одинаковое значение? Не существует какой-либо перестановки, например. '{3 3 3 3}' "первоначальный заказ"? – user463035818

ответ

0

Используйте раздел или stable_partition (чтобы сохранить исходный порядок).

class Predicate{ 
    int median_value; 
    public: 
    Predicate(int med) : median_value(med) {} 
    bool operator()(int x){ 
    return x < median_value; 
    } 
}; 

int main(){ 

vector<int> v{ 10, 20, 30, 10, 30}; 

int median = 20; 

cout << "median = " << median << endl; 

stable_partition(v.begin(), v.end(), Predicate(median)); 

for (auto i : v) 
    cout << i << " "; 
} 
+0

Это может работать - stable_partition - среднее значение O (n), которое я считаю и наихудшим O (nlogn). Я бы перепробовал: как бы вы нашли медианную? С помощью этой опции вам не разрешается изменять порядок при поиске медианного ... прав? – aces

+0

не учитывал медианное вычисление в приведенном выше коде. , вероятно, существует (?) Интегрированный алгоритм для поиска медианы при сохранении порядка. – 911

+0

Да - но, вероятно, не эффективный. – aces