题目:main函数中a数组的n个元素互不相同。函数insert(int a[],int n,int x)的 功能是:在一维有序数组a中插入x,插入x后数组a仍保持原来的有序性。
例如:调用insert函数前,main函数中a数组的元素为 12 9 4 3 0 -5
当x的值为1时,调用insert函数后,a数组的元素为 12 9 4 3 1 0 -5
调用insert函数前,main函数中b数组的元素为 -10 -4 2 7
当x的值为1时,调用insert函数后,b数组的元素为 -10 -4 1 2 7
解题的关键在于,如何判断数组是哪一种有序,是升序还是降序.接着就是对要插入元素找寻插入位置,找到后,那必然是对数组的移动操作,因此步骤如下
- 判断数组为何等顺序
- 找寻插入位置
- 将其他数组元素向后移动
- 将数组插入原来位置
这时我们想一下,如果是升序,那么前两个元素一定是第一个比第二个小,降序则反之,那么是不是可以通过这一点来判断呢?当然是可以的
int flag = a[0] > a[1];
这里假设是降序,那就是要找到一个要插入的元素(x),x比其中一个元素大的位置,而前一个位置就是该x要待的位置.
当然,在插入之前,需要将那个位置后的元素向后移动,因此我们应该是从后往前遍历
这里我们设置cur为当前指向数组最后一个元素的指针,而prev为最后一个元素的后一个.
只要满足x>a[i]的条件,cur和prev就都向左走
这里1<3,不满足条件,因此将x放在prev的位置
所以,要先判断插入位置,降序就是说,只要有比x小的数就要往后移动,x就要放在那个数前面,升序就是比它大的数要向后移动,因此,可以放在一起判断,减少冗余
for (i = n-1; i >= 0&&(flag? x > a[i]: x < a[i]); i--)
{
a[i + 1] = a[i];
}
a[i + 1] = x;
最后程序如此:
void insert(int a[], int n, int x)
{
int cur = n - 1, prev = n - 1 + 1;
int flag = a[0] > a[1];
for (cur = n-1; cur >= 0&&(flag? x > a[cur]: x < a[cur]); cur--)
{
prev = cur + 1;
a[prev] = a[cur];
}
a[prev] = x;
}
void print(int a[], int n)
{
int i;
for (i = 0; i < n; ++i)
printf("%d\t", a[i]);
printf("\n");
}
int main()
{
int a[10] = { 12,9,4,3,0,-5 };
int b[10] = { -10,-4,2,7 };
int n, m, x;
n = 6, m = 4, x = 1;
print(a, n);
insert(a, n++, x);
print(a, n);
print(b, m);
insert(b, m++, x);
print(b, m);
return 0;
}
比较基础的代码,但是搞清楚逻辑也没有那么简单。