Учитывая пять случайных элементов, можно найти медиана, используя только шесть сравнений. Но у меня есть дополнительное требование о том, что следующее условие также выполнено:Можно разделить пять элементов по медианной с шестью сравнениями?
< с & & б < с & & с < d & & с < е
Это НЕ требуется для < б или d < e.
Я смог удовлетворить это условие, используя семь сравнения, но не шесть. Это мой код, который должен быть Спроецировать
void medianSort(int[] arr)
{
assert(arr.length == 5);
void sortPair(ref int a, ref int b)
{
if(a > b) swap(a, b);
}
sortPair(arr[0], arr[1]);
sortPair(arr[3], arr[4]);
sortPair(arr[0], arr[3]);
sortPair(arr[1], arr[4]);
sortPair(arr[2], arr[3]);
sortPair(arr[1], arr[2]);
sortPair(arr[2], arr[3]);
}
Я быстро то, что я хочу, чтобы усилить с помощью медианы пяти выбрать точку опоры. Выполняя это условие, пять элементов уже отсортированы.
Можно ли выполнить это в шести сравнениях, или это семь лучших, что я могу сделать?
Пусть a = 1, b = 5, c = 4, d = 2, e = 3. Ваш алгоритм дает 1,4,5,2,3. Более того, у меня есть легкое формальное доказательство того, что менее 5 сравнений невозможно. Несколько более сложное доказательство подталкивает его до 6. Я постараюсь опубликовать его, когда у меня будет больше времени. –
Он работает, я тестировал его над тысячами перестановок. Я также реализовал его в своем быстром роде, и он отлично работает. Я подозреваю, что вы сделали что-то неправильно, так как я получил результат 1,2,3,5,4. Он также выполняет 6 сравнений, см. Последнее утверждение, // # 6. – Xinok
Извините, я не прокрутил вниз. Отличная работа! –