华科10年计算机考研复试笔试(算法基础)(1)

【1】给一系列数:a1,a2,a3,...,an,要求找出其中2个数ai,aj,使得ai+aj=X,算法时间复杂度为:O(nlogn)。

思路:

先排序,采用快排。在设置2个指针low、high,分别指向第一个、最后一个数,然后向中间扫描靠拢,遇到a[low]+a[high]就输出。

直到low=high。

 

参考代码:

#include<stdio.h> #define MAXLEN 1000 int partition(int a[],int low,int high){ int pivotkey=a[low]; while(low<high){ while(low<high&&a[high]>=pivotkey){ --high; } a[low]=a[high]; while(low<high&&a[low]<=pivotkey){ ++low; } a[high]=a[low]; } a[low]=pivotkey; return low; } void quickSort(int a[],int low,int high){//快排; if(low<high){//这一句必须有; int mid=partition(a,low,high); quickSort(a,low,mid-1); quickSort(a,mid+1,high); } } int main(){ int a[MAXLEN],n,i,low,high,sum,count; printf("请输入数的个数:/n"); scanf("%d",&n); printf("请输入这n个数:/n"); for(i=0;i<n;i++){ scanf("%d",&a[i]); } printf("请输入和:/n"); scanf("%d",&sum); quickSort(a,0,n-1);//快排n个元素; printf("排序后:/n"); for(i=0;i<n;i++){ printf("%d ",a[i]); } printf("/n满足要求的数据有:/n"); low=0; high=n-1; count=0;//记录符合条件的组数; while(low<high){ while(low<high&&a[low]+a[high]>sum){ --high; } while(low<high&&a[low]+a[high]<sum){ ++low; } if((a[low]+a[high])==sum){ ++count; printf("%d+%d=%d/n",a[low],a[high],sum); --high;//指针继续移动,寻找下一组符合要求的数据; } } if(count==0){ printf("没有符合条件的2个数!/n"); } }

数据测试:

华科10年计算机考研复试笔试(算法基础)(1)_第1张图片

华科10年计算机考研复试笔试(算法基础)(1)_第2张图片

华科10年计算机考研复试笔试(算法基础)(1)_第3张图片

你可能感兴趣的:(算法,测试,ini)