解题思路:
1、当n > a[8]时
将n存储在a[9]中
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 7 | 8 | 17 | 23 | 24 | 59 | 62 | 101 | n |
if (n >= a[8]) a[9] = n;
2、当n < a[0]时
将n存储在a[0]中,原有排序依次向后移一位
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
n | 1 | 7 | 8 | 17 | 23 | 24 | 59 | 62 | 101 |
else if (n = 1; i--) { a[i] = a[i - 1]; } a[0] = n; //将n存储在a[0]中 }
3、当a[0] < n < a[8]时,需将n插入到第i+1个位置中
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 7 | 8 | 17 | n | 23 | 24 | 59 | 62 | 101 |
else if (n > a[0] && n <= a[8]) { for (i = 0; i a[i] && n i; j--) { a[j] = a[j - 1]; //插入n,n后的数往后移一格; } a[i + 1] = n; //将n存储在a[i+1]中 } } }
参考代码:
#includeint main(void) { int a[10]; int i; int n; for (i = 0; i < 9; i++) { scanf("%d", &a[i]); //将9个数存入数组a中 } scanf("%d", &n); //输入要插入的数 if (n >= a[8]) a[9] = n; //情况1 else if (n = 1; i--) { a[i] = a[i - 1]; } a[0] = n; } else if (n > a[0] && n <= a[8]) //情况3 { for (i = 0; i a[i] && n i; j--) { a[j] = a[j - 1]; } a[i + 1] = n; } } } for (i = 0; i <= 9; i++) { printf("%d\n", a[i]); } return 0; }
//还可使用二分法找到需要插入的位置,可有效提高时间复杂度 //不过后面没有将target插入到数组当中 #include<iostream> #include<vector> using namespace std; int searchInsert(vector<int>& nums, int target) { int start = 0; int end = nums.size() - 1; int mid; if (target < nums[0]) { return 0; } else if (target > nums[end]) { return end + 1; } else { while (start <= end) { mid = (start + end) >> 1 - 1; if (nums[mid] > target) { end = mid - 1; } else if (nums[mid] < target) { start = mid + 1; } if (nums[mid] == target) { return mid; } } return mid + 1; } } int main(){ vector<int>nums; int target; int n; for (int i = 0; i < 9; i++) { cin >> n; nums.push_back(n); } cin >> target; int index = searchInsert(nums, target); for (int i = 0; i < index; i++) { cout << nums[i] << endl; } cout << target << endl; for (int i = index; i < 9; i++) { cout << nums[i] << endl; } return 0; }
0.0分
50 人评分
我想说其实不用这么分三种情况吧! 原数组是正序的数组,我们找到插入点的下标,进行赋值,然后把原插入点及后面的每一位数都进行下标后移一位;找到插入点方法是,当原数组里第一个大于或等于该插入数的数值,则这个数的下标就是我们的插入点。(因为原数组是正序数组)
#include<stdio.h> //#pragma warning(disable:4996); int main() { int a[12], b; scanf("%d %d %d %d %d %d %d %d %d", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9]); scanf("%d", &b); for (int i = 1;i <= 9;i++) { printf("%d\n", a[i]);//当未满足插入条件时依次输出值 if (b >= a[i] && b < a[i + 1])//当满足插入的条件时 { printf("%d\n", b);//输出插入的值 for (int j = i + 1;j <= 9;j++)//从i+1开始,将插入位置后面的数据输出 { printf("%d\n", a[j]); } return 0;//结束 } } return 0; }
简单的a+b (C语言代码)浏览:716 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:564 |
汽水瓶 (C语言代码)浏览:697 |
C语言程序设计教程(第三版)课后习题10.1 (Java代码)浏览:1436 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:594 |
C语言程序设计教程(第三版)课后习题8.6 (C语言代码)浏览:529 |
最长单词 (C语言代码)浏览:1362 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:896 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:885 |
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:517 |