#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define countof(array) (sizeof(array) / sizeof((array)[0]))
// Фтыкает value в нужное место массива array с текущим размером из length.
// Кладет в length новый размер массива, возвращает индекс нового элемента.
// Никаких реаллокаций не делает, подразумевая, что памяти хватит, чтобы
// увеличить массив хотя бы на один элемент.
static int insert(int value, int *array, int *length)
{
int first = 0;
int last = *length - 1;
int pos = -1;
// Специальный случай bsearch. Скукоживаем диапазон в поисках правильной
// позиции, в которую нужно записать значение.
while (first <= last) {
// Вычисляем индекс элемента в середине диапазона.
int i = first + (last - first) / 2;
if (value < array[i]) {
// Фтыкаемое значение меньше текущего элемента. Ограничиваем
// диапазон сверху предыдущим элементом.
last = i - 1;
} else if (value > array[i]) {
// Фтыкаемое значение больше текущего элемента. Ограничиваем
// диапазон снизу.
first = i + 1;
} else {
// В массиве нашелся элемент с точно таким же значением.
pos = i;
break;
}
}
if (pos < 0) {
// Если мы не нашли такой же элемент в массиве, тогда first равен
// позиции, где мы ожидали этот элемент увидеть.
pos = first;
}
// Подвигаем хвост массива, чтобы освободить место под элемент.
memmove(array
+ pos
+ 1, array
+ pos
, (size_t) (*length
- pos
) * sizeof(array
[0]));
// Фтыкаем элемент на его законное место.
array[pos] = value;
// Обновляем length.
++(*length);
return pos;
}
int main(void)
{
int array[128];
int length = 0;
// Зополняем массиф.
while (length < (int) countof(array))
{
int value
= rand() % 300; int pos = insert(value, array, &length);
printf("Inserted %d at %d\n", value
, pos
); }
// Выводем массиф.
for (int i = 0; i < length; ++i) {
printf("%3d: %-11d\n", i
, array
[i
]);
if (i + 1 < length && array[i] > array[i + 1]) {
}
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dGltZS5oPgoKI2RlZmluZSBjb3VudG9mKGFycmF5KSAoc2l6ZW9mKGFycmF5KSAvIHNpemVvZigoYXJyYXkpWzBdKSkKCi8vINCk0YLRi9C60LDQtdGCIHZhbHVlINCyINC90YPQttC90L7QtSDQvNC10YHRgtC+INC80LDRgdGB0LjQstCwIGFycmF5INGBINGC0LXQutGD0YnQuNC8INGA0LDQt9C80LXRgNC+0Lwg0LjQtyBsZW5ndGguCi8vINCa0LvQsNC00LXRgiDQsiBsZW5ndGgg0L3QvtCy0YvQuSDRgNCw0LfQvNC10YAg0LzQsNGB0YHQuNCy0LAsINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC40L3QtNC10LrRgSDQvdC+0LLQvtCz0L4g0Y3Qu9C10LzQtdC90YLQsC4KLy8g0J3QuNC60LDQutC40YUg0YDQtdCw0LvQu9C+0LrQsNGG0LjQuSDQvdC1INC00LXQu9Cw0LXRgiwg0L/QvtC00YDQsNC30YPQvNC10LLQsNGPLCDRh9GC0L4g0L/QsNC80Y/RgtC4INGF0LLQsNGC0LjRgiwg0YfRgtC+0LHRiwovLyDRg9Cy0LXQu9C40YfQuNGC0Ywg0LzQsNGB0YHQuNCyINGF0L7RgtGPINCx0Ysg0L3QsCDQvtC00LjQvSDRjdC70LXQvNC10L3Rgi4Kc3RhdGljIGludCBpbnNlcnQoaW50IHZhbHVlLCBpbnQgKmFycmF5LCBpbnQgKmxlbmd0aCkKewogICAgaW50IGZpcnN0ID0gMDsKICAgIGludCBsYXN0ID0gKmxlbmd0aCAtIDE7CiAgICBpbnQgcG9zID0gLTE7CgogICAgLy8g0KHQv9C10YbQuNCw0LvRjNC90YvQuSDRgdC70YPRh9Cw0LkgYnNlYXJjaC4g0KHQutGD0LrQvtC20LjQstCw0LXQvCDQtNC40LDQv9Cw0LfQvtC9INCyINC/0L7QuNGB0LrQsNGFINC/0YDQsNCy0LjQu9GM0L3QvtC5CiAgICAvLyDQv9C+0LfQuNGG0LjQuCwg0LIg0LrQvtGC0L7RgNGD0Y4g0L3Rg9C20L3QviDQt9Cw0L/QuNGB0LDRgtGMINC30L3QsNGH0LXQvdC40LUuCiAgICB3aGlsZSAoZmlyc3QgPD0gbGFzdCkgewogICAgICAgIC8vINCS0YvRh9C40YHQu9GP0LXQvCDQuNC90LTQtdC60YEg0Y3Qu9C10LzQtdC90YLQsCDQsiDRgdC10YDQtdC00LjQvdC1INC00LjQsNC/0LDQt9C+0L3QsC4KICAgICAgICBpbnQgaSA9IGZpcnN0ICsgKGxhc3QgLSBmaXJzdCkgLyAyOwoKICAgICAgICBpZiAodmFsdWUgPCBhcnJheVtpXSkgewogICAgICAgICAgICAvLyDQpNGC0YvQutCw0LXQvNC+0LUg0LfQvdCw0YfQtdC90LjQtSDQvNC10L3RjNGI0LUg0YLQtdC60YPRidC10LPQviDRjdC70LXQvNC10L3RgtCwLiDQntCz0YDQsNC90LjRh9C40LLQsNC10LwKICAgICAgICAgICAgLy8g0LTQuNCw0L/QsNC30L7QvSDRgdCy0LXRgNGF0YMg0L/RgNC10LTRi9C00YPRidC40Lwg0Y3Qu9C10LzQtdC90YLQvtC8LgogICAgICAgICAgICBsYXN0ID0gaSAtIDE7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IGFycmF5W2ldKSB7CiAgICAgICAgICAgIC8vINCk0YLRi9C60LDQtdC80L7QtSDQt9C90LDRh9C10L3QuNC1INCx0L7Qu9GM0YjQtSDRgtC10LrRg9GJ0LXQs9C+INGN0LvQtdC80LXQvdGC0LAuINCe0LPRgNCw0L3QuNGH0LjQstCw0LXQvAogICAgICAgICAgICAvLyDQtNC40LDQv9Cw0LfQvtC9INGB0L3QuNC30YMuCiAgICAgICAgICAgIGZpcnN0ID0gaSArIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8g0JIg0LzQsNGB0YHQuNCy0LUg0L3QsNGI0LXQu9GB0Y8g0Y3Qu9C10LzQtdC90YIg0YEg0YLQvtGH0L3QviDRgtCw0LrQuNC8INC20LUg0LfQvdCw0YfQtdC90LjQtdC8LgogICAgICAgICAgICBwb3MgPSBpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHBvcyA8IDApIHsKICAgICAgICAvLyDQldGB0LvQuCDQvNGLINC90LUg0L3QsNGI0LvQuCDRgtCw0LrQvtC5INC20LUg0Y3Qu9C10LzQtdC90YIg0LIg0LzQsNGB0YHQuNCy0LUsINGC0L7Qs9C00LAgZmlyc3Qg0YDQsNCy0LXQvQogICAgICAgIC8vINC/0L7Qt9C40YbQuNC4LCDQs9C00LUg0LzRiyDQvtC20LjQtNCw0LvQuCDRjdGC0L7RgiDRjdC70LXQvNC10L3RgiDRg9Cy0LjQtNC10YLRjC4KICAgICAgICBwb3MgPSBmaXJzdDsKICAgIH0KCiAgICAvLyDQn9C+0LTQstC40LPQsNC10Lwg0YXQstC+0YHRgiDQvNCw0YHRgdC40LLQsCwg0YfRgtC+0LHRiyDQvtGB0LLQvtCx0L7QtNC40YLRjCDQvNC10YHRgtC+INC/0L7QtCDRjdC70LXQvNC10L3Rgi4KICAgIG1lbW1vdmUoYXJyYXkgKyBwb3MgKyAxLCBhcnJheSArIHBvcywgKHNpemVfdCkgKCpsZW5ndGggLSBwb3MpICogc2l6ZW9mKGFycmF5WzBdKSk7CgogICAgLy8g0KTRgtGL0LrQsNC10Lwg0Y3Qu9C10LzQtdC90YIg0L3QsCDQtdCz0L4g0LfQsNC60L7QvdC90L7QtSDQvNC10YHRgtC+LgogICAgYXJyYXlbcG9zXSA9IHZhbHVlOwoKICAgIC8vINCe0LHQvdC+0LLQu9GP0LXQvCBsZW5ndGguCiAgICArKygqbGVuZ3RoKTsKCiAgICByZXR1cm4gcG9zOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgICBzcmFuZCgodW5zaWduZWQpIHRpbWUoTlVMTCkpOwoKICAgIGludCBhcnJheVsxMjhdOwogICAgaW50IGxlbmd0aCA9IDA7CgogICAgLy8g0JfQvtC/0L7Qu9C90Y/QtdC8INC80LDRgdGB0LjRhC4KICAgIHdoaWxlIChsZW5ndGggPCAoaW50KSBjb3VudG9mKGFycmF5KSkKICAgIHsKICAgICAgICBpbnQgdmFsdWUgPSByYW5kKCkgJSAzMDA7CiAgICAgICAgaW50IHBvcyA9IGluc2VydCh2YWx1ZSwgYXJyYXksICZsZW5ndGgpOwogICAgICAgIHByaW50ZigiSW5zZXJ0ZWQgJWQgYXQgJWRcbiIsIHZhbHVlLCBwb3MpOwogICAgfQoKICAgIC8vINCS0YvQstC+0LTQtdC8INC80LDRgdGB0LjRhC4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICBwcmludGYoIiUzZDogJS0xMWRcbiIsIGksIGFycmF5W2ldKTsKCiAgICAgICAgaWYgKGkgKyAxIDwgbGVuZ3RoICYmIGFycmF5W2ldID4gYXJyYXlbaSArIDFdKSB7CiAgICAgICAgICAgIHByaW50ZigiUGl6ZGFyaWtpIVxuIik7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgfQp9Cg==