/*已知数组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("请输入需要插入数组中的数字 "); scanf("%i",&num); //调用函数获取下标 int index = arrayInsertNumber(a, num, length); printf("需要插入数组a[]下标为 %i 的位置 ",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("插入后的数组为: "); //遍历输出b[] for (int i = 0; i < length + 1; i++) { printf("%i ",b[i]); } printf(" "); return 0; }