Как можно сгенерировать случайную позицию для опорного элемента быстрой сортировки не используя функцию rand?
Как можно сгенерировать случайную позицию для опорного элемента быстрой сортировки не используя функцию rand? Другие стратегии выбора не подходят из за специфики задания.
#include <iostream>
size_t random_position(){
//
}
template <typename T, typename Comparator = std::less<T>>
size_t partition(T* arr, size_t left, size_t right, Comparator cmp = Comparator()){
std::swap(arr[left + random_position() % (right - left)], arr[right]);
T piv = arr[right];
size_t left_iter, right_iter;
size_t i = left;
for (; cmp(arr[i], piv); i++);
left_iter = right_iter = i;
while(true)
{
while(cmp(piv, arr[right_iter]))
right_iter++;
if (right_iter == right) {
std::swap(arr[left_iter], arr[right]);
return left_iter;
}
else{
std::swap(arr[right_iter], arr[left_iter]);
right_iter++;
left_iter++;
}
}
}
template <typename T, typename Comparator = std::less<T>>
T QuickSelect(T* arr, size_t k, size_t left, size_t right, Comparator cmp = Comparator()){
while (left != right){
size_t piv_pos = partition(arr, left, right, cmp);
if (piv_pos == k)
return arr[piv_pos];
else if (piv_pos > k)
right = piv_pos - 1;
else
left = piv_pos + 1;
}
return arr[k];
}
Ответы (1 шт):
Автор решения: Zhihar
→ Ссылка
ну всегда же есть rand заменители, например:
LAGRE_INTEGER value;
::QueryPerformanceCounter(&value);
const int num = value % 1000;