《算法导论》第23页练习2.3-7:
请给出一个运行时间为nlogn的算法,使之能在给定一个由n个整数构成的集合S和另一个整数时,判断出S中是否存在两个其和等于x的元素。
(1) 产生随机数
(2) 合并排序,复杂度为nlogn
(3) 查找符合要求的元素,复杂度为nlogn
总的复杂度为nlogn。
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 100
void set_random_array(int *array,int max);
void print_random(const int *array,int max);
void my_sort(int *array,int beg,int end);
void combine(int *array,int beg,int mid,int end);
void find_element(int *array,int max,int num);
int binary_search(const int *array,int beg,int end,int value,int *ret);
int main()
{
int array[MAX_NUM];
int num;
set_random_array(array,MAX_NUM);
print_random(array,MAX_NUM);
my_sort(array,0,MAX_NUM-1);
print_random(array,MAX_NUM);
printf("input a num/t");
fscanf(stdin,"%d",&num);
printf("/n");
find_element(array,MAX_NUM,num);
return(1);
}
void set_random_array(int *array,int max)
{
int n;
for(n = 0;n < max;n++)
{
array[n] = random() % 99;
}
return;
}
void print_random(const int *array,int max)
{
int n;
for(n = 0;n < max;n++)
{
printf("%d/t",array[n]);
}
printf("/n");
return;
}
void my_sort(int *array,int beg,int end)
{
int mid;
if((beg+1) == end)
{
if(array[beg] > array[end])
{
mid = array[beg];
array[beg] = array[end];
array[end] = mid;
}
}
else if(beg < end)
{
mid = (beg + end) / 2;
my_sort(array,beg,mid);
my_sort(array,mid+1,end);
combine(array,beg,mid,end);
}
return;
}
void combine(int *array,int beg,int mid,int end)
{
int *left,*right;
int m,n,pbeg,pmid;
#ifdef _DEBUG
printf("beg=%d mid=%d end%d/n",beg,mid,end);
#endif
pmid = mid;
pbeg = beg;
left = (int *)malloc((pmid-pbeg+2)*sizeof(int));
for(n = 0,pbeg = beg;pbeg <= pmid;pbeg++,n++)
{
left[n] = array[pbeg];
}
left[n] = 1000;
pmid = mid+1;
right = (int *)malloc((end-pmid+2)*sizeof(int));
for(n = 0;pmid <= end;pmid++,n++)
{
right[n] = array[pmid];
}
right[n] = 1000;
for(pbeg = beg,n = 0,m = 0;pbeg <= end;pbeg++)
{
if(left[n] < right[m])
{
array[pbeg] = left[n];
n++;
}else
{
array[pbeg] = right[m];
m++;
}
}
free(left);
free(right);
return;
}
void find_element(int *array,int max,int num)
{
int n,m;
int diff;
for(n = 0;n < max;n++)
{
diff = num - array[n];
if(binary_search(array,n+1,max-1,diff,&m) != 0)
{
printf("%d %d/n",array[n],array[m]);
}
}
return;
}
int binary_search(const int *array,int beg,int end,int value,int *ret)
{
int mid;
while(beg <= end)
{
mid = (beg+end)/2;
if(array[mid] == value)
{
*ret = mid;
return(mid);
}
else if(array[mid] > value)
end = mid - 1;
else
beg = mid + 1;
}
return(0);
}