代码
#include "stdio.h"
#define n 4
int M[n][n]={{4,5,6,7},{8,9,11,11},{9,11,12,13},{16,17,18,20}};
void getx(int x)
{
int flag=0;
if(x<M[0][0] || x>M[n-1][n-1]) //初步判断
{
printf("Not Found x!");
flag=1; //修改flag的值,无需继续查找
}
for(int i=0;i<n;i++){//对每一行进行查找,随后挪至下一行,直至结束
if(flag==1) break;
int left = 0,right = n-1;
while(left<=right){
int mid = left+(right-left)/2;
if(M[i][mid]==x){
flag=1;
printf("Found the number x");
break;
}else if(M[i][mid]>x){
right = mid-1;
}else{
left = mid+1;
}
}
}
if(flag==0) printf("Not Found x!");
}
main()
{ int i,j,a;
printf("Enter the number x:");scanf("%d",&a);
for(i=0;i<n;i++)
{ for(j=0;j<n;j++) printf("%4d",M[i][j]);
printf("\n");
}
getx(a);
}
时间复杂度
若整数x小于矩阵M最小值或大于矩阵M最大值,这是最好情况,时间复杂度为O(1);最坏情况下,因为二分复杂度为O(),加上for循环应为O(n)