题主可能没有注意j值的变化,要注意每次走完一次while循环后会j自减,所以当你再次进来的时候j已经是下一位了,例如你把9位放到10位,第9位空出来了,j自减后等于8,再进来时j是8,空是9,如果while判断条件没过跳出来的话,那就是放到a[j+1]里。(说的有点乱,可能有错也请指正)
要分析清楚while() 循环里循环条件是什么。
我认为参考资料中的段落与问题没有直接关联,因此不作回答。
关于问题中提到的插值问题,我们通常使用的插值算法是在有序数组中插入一个新元素,使得最终数组仍然保持有序。在这个过程中需要找到插入位置,即找到数组中第一个大于插入元素的位置。我们通常采用二分查找法来找到该位置,如果找到了该位置,我们需要将该位置及其中所有元素向后移动一位,再将插入元素赋值给该位置。这也解释了为什么题目中的第二个空格应该填入a[j]=x,而不是a[j+1]=x。如果填入a[j+1]=x,则可能会将本来应该在a[j]位置的元素挤出数组,使得数组元素不再有序。以下是采用二分查找法实现插值操作的示例代码:
int insert(int* a, int size, int x) {
int left = 0, right = size - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (x == a[mid]) {
return mid;
} else if (x < a[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
// 此时left即为插入位置
for (int i = size - 1; i >= left; i--) {
a[i + 1] = a[i];
}
a[left] = x;
return left;
}