第10题:寻找插入位置

给定一个已经升序排好序的数组,以及一个数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。现在的情况是如果不存在该关键字需要返回应插入的位置,因此跳出查找循环后需要判断一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值