64,654
社区成员
发帖
与我相关
我的任务
分享
template<typename RandomItr>
RandomItr medium_equal(RandomItr first1, RandomItr last1, RandomItr first2, RandomItr last2)
{
typedef typename std::iterator_traits<RandomItr>::difference_type difference_type;
difference_type const len = std::distance(first1, last1);
if(len == 1) return *first1 > *first2 ? first2 : first1;
difference_type const mid = (len - 1) / 2;
RandomItr mid1 = first1 + mid;
RandomItr mid2 = first2 + mid;
if(*mid1 == *mid2) return mid1;
if(*mid1 > *mid2)
{
return medium_equal(first1, mid1 + 1, mid2 + (len - 1) % 2, last2);
}
else
{
return medium_equal(mid1 + (len - 1) % 2, last1, first2, mid2 + 1);
}
}
inline void sort_two_00()
{
int array_1[] = {1, 2, 3, 4, 6, 9};
int array_2[] = {5, 7, 8, 9, 10, 12};
std::cout<<*medium_equal(std::begin(array_1), std::end(array_1),
std::begin(array_2), std::end(array_2)) << std::endl;
}
if(*mid1 > *mid2)
{
return medium_equal(first1, mid1 + 1, mid2 + (len - 1) % 2, last2);
}
else
{
return medium_equal(mid1 + (len - 1) % 2, last1, first2, mid2 + 1);
}
std::begin(array_1), std::end(array_1)
size_t const size = sizeof(array_1) / sizeof(size_t);
std::cout<<*medium_equal(array_1, array_1 + size,
array_2, array_2 + size) << std::endl;
#include <algorithm>
#include <iterator>
#include <iostream>
/*
* Find out the medium value between two sorted range
* the ranges must have the same numbers of elements
*
* complexity is log(n), n is the number of the elements
* of one of the sorted range
*/
template<typename ForwardItr>
ForwardItr medium_equal(ForwardItr first1, ForwardItr last1, ForwardItr first2, ForwardItr last2)
{
typedef typename std::iterator_traits<ForwardItr>::difference_type difference_type;
difference_type const len = std::distance(first1, last1);
if(len == 1) return *first1 > *first2 ? first2 : first1;
difference_type const mid = (len - 1) / 2;
ForwardItr mid1 = first1;
ForwardItr mid2 = first2;
std::advance(mid1, mid);
std::advance(mid1, mid);
if(*mid1 == *mid2) return mid1;
if(*mid1 > *mid2)
{
std::advance(mid1, 1);
std::advance(mid2, (len - 1) % 2);
return medium_equal(first1, mid1, mid2, last2);
}
else
{
std::advance(mid1, (len - 1) % 2);
std::advance(mid2, 1);
return medium_equal(mid1, last1, first2, mid2);
}
}
inline void sort_two_00()
{
int array_1[] = {1, 2, 3, 4, 6, 9};
int array_2[] = {5, 7, 8, 9, 10, 12};
std::cout<<*medium_equal(std::begin(array_1), std::end(array_1),
std::begin(array_2), std::end(array_2)) << std::endl;
}
#include <stdio.h>
int search_mid(int *a1, int *a2, int len)
{
if(len==1)
{
return (*a1<*a2)?*a1:*a2;
}
if(len==2)
{
if(*a1<*a2)
{
return (a1[1]<*a2)?a1[1]:*a2;
}
else
{
return (a2[1]<*a1)?a2[1]:*a1;
}
}
int mid = len/2;
if(a1[mid]==a2[mid])
{
return a1[mid];
}
if(a1[mid]<a2[mid])
{
return search_mid(a1+mid, a2, (len+1)/2);
}
else
{
return search_mid(a2+mid, a1, (len+1)/2);
}
}
void main()
{
int a1[5] = {11,112,113,114,1116};
int a2[5] = {15,17,18,91,110};
printf("%d\n", search_mid(a1, a2, 5));
}
template<typename RandomItr>
void nth_max(RandomItr first, RandomItr last, size_t number)
{
if(first == last) return;
if(static_cast<size_t>((last - first)) < number ) return;
typedef typename std::iterator_traits<RandomItr>::value_type value_type;
std::make_heap(first, first + number, std::greater<value_type>() );
RandomItr current = first + number;
while(current != last)
{
if(*first < *current)
{
std::swap(*first, *current);
std::make_heap(first, first + number, std::greater<value_type>() );
}
++current;
}
}