给定一个已经升序排好序的数组,以及一个数target,如果target在数组中,返回它在数组中的位置;否则,返回target插入数组后它应该在的位置(假设数组中没有重复的数)。
以下是简单的示例:
[1,3,5,6], 5 → 2
[1,3,5,6], 2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6], 0 → 0
提示:输入一个整数n,以及其对应的数组A[n],最后输入target
searchInsert(intA[], int n, int target)
样例输入
3
1 3 5
2
样例输出
1
相比于上一道题,这一题由于数组是已有序的,因此比较适合于折半查找法。当然,顺序查找法也是没有问题的(毕竟题目要求的时限还是比较多的)
先给出顺序查找的代码:
#include<stdio.h>
#include<stdlib.h>
intsearchInsert(int a[], int n, int elem);
int main(void) {
int *a;
int n, elem, i, target;
scanf("%d", &n);
if(n < 0)
return 0;
if(n == 0) {
printf("0");
return 0;
}
a = (int *) malloc (n * sizeof(int));
if(!a)
return 0;
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
scanf("%d", &elem);
target = searchInsert(a, n, elem);
if(-1 == target) {
free(a);
return 0;
}
printf("%d", target);
free(a);
return 0;
}
intsearchInsert(int a[], int n, int elem) {
int i;
for(i = 0; i < n; i++) {
if(a[i] == elem) {
return i;
}
}
for(i = 0; i < n; i++) {
if(a[i] >= elem) {
return i;
}
}
return -1;
}
下面给出折半查找的代码(只给出查找函数的代码,其他都一样的):
intsearchInsert(int a[], int n, int elem) {
int low, high, mid, i;
low = 0;
high = n-1;
mid = (low+high)/2;
while (low < high) {
if (a[mid] < elem) {
low = mid+1;
mid = (low+high)/2;
}
else if (a[mid] > elem) {
high = mid-1;
mid = (low+high)/2;
}
else
break;
}
if (a[mid] < elem)
return mid+1;
else
return mid;
}
这里需要注意的是一般的折半查找只需要确定数组中是否含有这个关键字,有则返回该位置;否则返回-1。现在的情况是如果不存在该关键字需要返回应插入的位置,因此跳出查找循环后需要判断一下。