有序数组的插入
题目
给定存储了 n 个从大到小排好序的整数,试将任一给定整数 x
插入数组中合适的位置,以保持结果依然有序。分析算法在最坏、最好情况下的时间、空间复杂度。
解题步骤
1.找到要插入的位置
2.移动元素
3.插入元素
4.数组长度加1
代码
bool DecrSeqInsert(ArrPtr array, ElemSet x) {
if (array->size == kMaxSize) {
return false;
}
// 检查元素是否已经存在
for (int i = 0; i < array->size; i++) {
if (array->data[i] == x) {
return false;
}
}
// 找到插入位置
int insertPos = 0;
while (insertPos < array->size && array->data[insertPos] > x) {
insertPos++;
}
// 移动元素
for (int i = array->size; i > insertPos; i--) {
array->data[i] = array->data[i - 1];
}
// 插入元素
array->data[insertPos] = x;
// 更新数组大小
array->size++;
return true;
}
步骤详解
1.检查数组是否达到最大长度,检查待插入元素是否存在。
2.找到insertPos(这里是数组的一个索引)
// 找到插入位置
int insertPos = 0;
while (insertPos < array->size && array->data[insertPos] > x) {
insertPos++;
}
比如数组[5,4,1,0], 现在要插入3, 那么insertPos就是2,即元素1的索引。
3.移动元素
比如数组[5,4,1,0], 现在要插入3,那么1和0要向后移动一位。
for (int j = array->size; j > insertPos; j--) {
array->data[j] = array->[j - 1];
}
4.数组长度加1