往有序数组中插入数

/*已知数组a中的元素已按由小到大顺序排列,以下程序的功能是将输入的一个数插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列*/

#include <stdio.h>
/**
 *  折半查找法找到需要插入的位置(下标)
 *
 *  @param p      数组
 *  @param num    需要插入的数
 *  @param length 数组元素的个数
 *
 *  @return 需要插入数组对应的下标
 */
int arrayInsertNumber(int *p, int num,int length)
{
    int max = length - 1;
    int min = 0;
    int mid = (max + min)/2;
    
    while (max >= min) {
        mid = (max + min)/2;
        if (num > p[mid]) {
            min = mid + 1;
        }else if (num < p[mid]) {
            max = mid - 1;
        }else {
            return mid;
        }
    }
    return mid - 1;
}

int main(int argc, const char * argv[]) {
    
    int  a[] = {1,3,5,5,7,9,10,19,20,30};
    int length = sizeof(a)/sizeof(a[0]);
    //定义数组b[]保存插入后的数据
    int b[length + 1];
    
    int num;
    printf("请输入需要插入数组中的数字\n");
    scanf("%i",&num);
    //调用函数获取下标
    int index = arrayInsertNumber(a, num, length);
    printf("需要插入数组a[]下标为 %i 的位置\n",index);
    
    int j = 0;
    //遍历数组a[]
    for (int i = 0; i < length ; i++) {
        //index前的数分别对应赋值给b[]
        if (i < index) {
            b[j++] = a[i];
        }
        //index对应的a[i]仍然对应赋值,把num插入到index+1的位置
        else if (i == index) {
            b[j] = a[i];
            b[++j] = num;
        }
        //原a数组index之后的数据依次后移一位
        else {
            b[++j] = a[i];
        }
    }
    printf("插入后的数组为:\n");
    //遍历输出b[]
    for (int i = 0; i < length + 1; i++) {
        printf("%i ",b[i]);
    }
    printf("\n");
    return 0;
}

 

posted on 2016-02-14 17:41  战斗宝宝007  阅读(832)  评论(0编辑  收藏  举报

导航