Give a divide and conquer algorithm for the followingproblem: you are given two sorted lists of sizem and n, and are allowedunit time access to the ith elementof each list. Give anO(lgm + lgn) timealgorithm for computing the kth largest element in the union of the two lists. (For simplicity, you can assumethat the elements of the two lists are distinct).
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<malloc.h>
int partition(int a[],int p,int r);
void quicksort(int a[],int p,int r);
int findi(int a[],int i);
int FindTheKth(int a[],int b[],int aLeft, int aRight, int bLeft, int bRight, int k) ;
void main()
{
int n,m,i;
srand((int)time(NULL));
printf("请输入两个数组的大小:\n");
printf("n:");
scanf("%d",&n);
printf("m:");
scanf("%d",&m);
int* a=(int*)malloc(sizeof(int)*n);
int* b=(int*)malloc(sizeof(int)*m);
printf("a数组:\n");
for(i=0;i<n;i++)
{
a[i]=rand()%100;
printf("%d\t",a[i]);
}
printf("\nb数组:\n");
for(i=0;i<m;i++)
{
b[i]=rand()%100;
printf("%d\t",b[i]);
}
quicksort(a,0,n-1);
quicksort(b,0,m-1);
printf("\n排序后的a数组:\n");
for(i=0;i<n;i++)
{
printf("%d\t",a[i]);
}
printf("\n排序后的b数组:\n");
for(i=0;i<m;i++)
{
printf("%d\t",b[i]);
}
printf("\n");
printf("数组a的第4个元素:%d\n",findi(a,4));
printf("数组b的第4个元素:%d\n",findi(b,4));
printf("%d\n",FindTheKth(a,b,0, n-1, 0, m-1, 7));
free(a);
free(b);
}
void quicksort(int a[],int p,int r)
{
int q;
if(p<r)
{
q=partition(a,p,r);
quicksort(a,p,q-1);
quicksort(a,q+1,r);
}
}
int partition(int a[],int p,int r)
{
int x,i,j,temp;
x=a[r];
i=p-1;
for(j=p;j<r;j++)
{
if(a[j]<=x)
{
i++;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
temp=a[i+1];
a[i+1]=a[r];
a[r]=temp;
return i+1;
}
int findi(int a[],int i)
{
int size=0;
for(;;)
if(a[size]>=0&&a[size]<=100)
size++;
else
break;
if(i>size||i<1)
{
return -1;
}
else
return a[i-1];
}
int FindTheKth(int a[],int b[],int aLeft, int aRight, int bLeft, int bRight, int k)
{
int aMid = (aLeft + aRight) / 2, bMid = (bLeft + bRight) / 2;
if (aLeft > aRight) return b[bLeft+k-1];
if (bLeft > bRight) return a[aLeft+k-1];
if (a[aMid] <= b[bMid])
{
if (k <= (aMid - aLeft) + (bMid - bLeft) + 1)
{
return FindTheKth(a,b,aLeft, aRight, bLeft, bMid-1, k);
}
else
{
return FindTheKth(a,b,aMid+1, aRight, bLeft, bRight, k-(aMid-aLeft)-1);
}
}
else
{
if (k <= (aMid - aLeft) + (bMid - bLeft) + 1)
{
return FindTheKth(a,b,aLeft, aMid-1, bLeft, bRight, k);
}
else
{
return FindTheKth(a,b,aLeft, aRight, bMid+1, bRight, k-(bMid-bLeft)-1);
}
}
return -1;
}