double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
if (nums1Size == 0)
{
if (nums2Size == 0)
{
printf("error\n");
exit(1);
}
if ( (nums2Size&1) == 0)
{
return (double)(nums2[nums2Size>>1]+nums2[(nums2Size>>1)-1]) / 2;
}
else
{
return nums2[nums2Size>>1];
}
}
else if (nums2Size == 0)
{
if ((nums1Size&1) == 0)
{
return (double)(nums1[nums1Size>>1]+nums1[(nums1Size>>1)-1]) / 2;
}
else
{
return nums1[nums1Size>>1];
}
}
else if ( ((nums1Size+nums2Size)&1) == 0 )
// a+a a
// b+b b
// a+b a+b-1
// nums2[pos2-1] == nums1[pos1] nums2[pos2]
// nums1[pos1] nums2[pos2-1] == nums1[pos1+1] nums2[pos2]
// 1 2 3 4 5 6 7 8
// 9 10 11 12 13 14
// 2a+1 a
// 2b+1 b
// a+b+1 a+b
{
if ( (nums1Size&1) == 0)
{
int pos1=nums1Size>>1;
int pos2=nums2Size>>1;
if (nums1[pos1]<nums2[pos2])
{
while (1)
{
if (pos1==nums1Size-1)
{
int sum;
int i1=pos1;
int i2=pos2-1;
if (i2<0 || nums1[i1]>nums2[i2])
{
sum=nums1[i1];
--i1;
}
else
{
sum=nums2[i2];
--i2;
}
if (i2<0 || nums1[i1]>nums2[i2])
{
sum+=nums1[i1];
}
else
{
sum+=nums2[i2];
}
return (double)sum/2;
}
if (pos2==0)
{
return (double)(nums1[pos1]+nums1[pos1-1])/2;
}
--pos2;
if (nums2[pos2]<=nums1[pos1])
{
if (pos2<0 || nums1[pos1-1]>=nums2[pos2])
{
return (double)(nums1[pos1-1]+nums1[pos1])/2;
}
else
{
return (double)(nums2[pos2]+nums1[pos1])/2;
}
}
++pos1;
if (nums1[pos1]>=nums2[pos2])
{
if (pos2 !=0 && nums2[pos2-1]>=nums1[pos1-1])
{
return (double)(nums2[pos2-1]+nums2[pos2])/2;
}
else
{
return (double)(nums1[pos1-1]+nums2[pos2])/2;
}
}
}
}
else if (nums1[pos1]>nums2[pos2])
{
while (1)
{
if (pos2==nums2Size-1)
{
int sum;
int i2=pos2;
int i1=pos1-1;
if (i1<0 || nums2[i2]>nums1[i1])
{
sum=nums2[i2];
--i2;
}
else
{
sum=nums1[i1];
--i1;
}
if (i1<0 || nums2[i2]>nums1[i1])
{
sum+=nums2[i2];
}
else
{
sum+=nums1[i1];
}
return (double)sum/2;
}
if (pos1==0)
{
return (double)(nums2[pos2]+nums2[pos2-1])/2;
}
--pos1;
if (nums1[pos1]<=nums2[pos2])
{
if (pos1<0 || nums2[pos2-1]>=nums1[pos1])
{
return (double)(nums2[pos2-1]+nums2[pos2])/2;
}
else
{
return (double)(nums1[pos1]+nums2[pos2])/2;
}
}
++pos2;
if (nums2[pos2]>=nums1[pos1])
{
if (pos1 !=0 && nums1[pos1-1]>=nums2[pos2-1])
{
return (double)(nums1[pos1-1]+nums1[pos1])/2;
}
else
{
return (double)(nums2[pos2-1]+nums1[pos1])/2;
}
}
}
}
else
{
if (pos1==0)
{
return (double)(nums2[pos2]+nums2[pos2-1])/2;
}
else if (pos2==0)
{
return (double)(nums1[pos1]+nums1[pos1-1])/2;
}
else if(nums1[pos1-1]<=nums2[pos2-1])
{
return (double)(nums1[pos1]+nums2[pos2-1])/2;
}
else
{
return (double)(nums1[pos1]+nums1[pos1-1])/2;
}
}
}
else
// 2a+1 a
// 2b+1 b
// a+b+1 a+b
// nums2[pos2-1] == nums1[pos1] nums2[pos2]
// nums1[pos1] nums2[pos2-1] == nums1[pos1+1] nums2[pos2]
// 1 2 3 4 5
// 8 9 10 11 12
{
int pos1=nums1Size>>1;
int pos2=nums2Size>>1;
if (nums1[pos1]<nums2[pos2])
{
while (1)
{
if (pos1==nums1Size-1)
{
if (pos2 == 0 || nums2[pos2-1]<nums1[pos1])
{
return (double)(nums2[pos2]+nums1[pos1])/2;
}
else
{
return (double)(nums2[pos2]+nums2[pos2-1])/2;
}
}
if (pos2==0)
{
if (nums1[pos1+1]<=nums2[0])
{
return (double)(nums1[pos1]+nums1[pos1+1])/2;
}
else
{
return (double)(nums1[pos1]+nums2[0])/2;
}
}
--pos2;
if (nums2[pos2]<=nums1[pos1])
{
if ( nums1[pos1+1]<=nums2[pos2+1])
{
return (double)(nums1[pos1+1]+nums1[pos1])/2;
}
else
{
return (double)(nums2[pos2+1]+nums1[pos1])/2;
}
}
// nums1[pos1] nums2[pos2-1] == nums1[pos1+1] nums2[pos2]
// 2 3 5 4
++pos1;
if (nums1[pos1]>=nums2[pos2])
{
if (nums1[pos1]>=nums2[pos2+1])
{
return (double)(nums2[pos2+1]+nums2[pos2])/2;
}
else
{
return (double)(nums1[pos1]+nums2[pos2])/2;
}
}
}
}
else if (nums1[pos1]>nums2[pos2])
{
while (1)
{
if (pos2==nums2Size-1)
{
if (pos1 == 0 || nums1[pos1-1]<nums2[pos2])
{
return (double)(nums1[pos1]+nums2[pos2])/2;
}
else
{
return (double)(nums1[pos1]+nums1[pos1-1])/2;
}
}
if (pos1==0)
{
if (nums2[pos2+1]<=nums1[0])
{
return (double)(nums2[pos2]+nums2[pos2+1])/2;
}
else
{
return (double)(nums2[pos2]+nums1[0])/2;
}
}
--pos1;
if (nums1[pos1]<=nums2[pos2])
{
if ( nums2[pos2+1]<=nums1[pos1+1])
{
return (double)(nums2[pos2+1]+nums2[pos2])/2;
}
else
{
return (double)(nums1[pos1+1]+nums2[pos2])/2;
}
}
++pos2;
if (nums2[pos2]>=nums1[pos1])
{
if (nums2[pos2]>=nums1[pos1+1])
{
return (double)(nums1[pos1+1]+nums1[pos1])/2;
}
else
{
return (double)(nums2[pos2]+nums1[pos1])/2;
}
}
}
}
else
{
return nums1[pos1];
}
}
}
else
{
// 2a a a+1
// 2b+1 b
// nums1[pos1] nums2[pos2-1] nums1[pos1+1] nums2[pos2]
// 1 2 3 4 5
// 6 7 8 9
// 1 2 3
// 4 5
// 1 2 3 4
// 5 6 7
// 1 1 2 2 3
// 4 5 6 7 8 9 10 11
int pos1=nums1Size>>1;
int pos2=nums2Size>>1;
if (nums1[pos1]<nums2[pos2])
{
while (1)
{
if (pos1==nums1Size-1)
{
if (pos2==0 || nums2[pos2-1]<nums1[pos1])
{
return nums1[pos1];
}
else
{
return nums2[pos2-1];
}
}
if (pos2==0)
{
return nums1[pos1];
}
--pos2;
if (nums2[pos2]<=nums1[pos1])
{
return nums1[pos1];
}
++pos1;
if (nums1[pos1]>=nums2[pos2])
{
return nums2[pos2];
}
}
}
else if (nums1[pos1]>nums2[pos2])
{
while (1)
{
if (pos2==nums2Size-1)
{
if (pos1==0 || nums1[pos1-1]<nums2[pos2])
{
return nums2[pos2];
}
else
{
return nums1[pos1-1];
}
}
if (pos1==0)
{
return nums2[pos2];
}
--pos1;
if (nums1[pos1]<=nums2[pos2])
{
return nums2[pos2];
}
++pos2;
if (nums2[pos2]>=nums1[pos1])
{
return nums1[pos1];
}
}
}
else
{
return nums1[pos1];
}
}
}