Это плохая практика, чтобы разделить массив C, просто используя указатель на его середину? - PullRequest
8 голосов
/ 17 февраля 2012

Я реализую версию сортировки слиянием в c.Для первого шага я должен разбить массив на подмассивы.

Разве это плохая практика, просто сделать это, имея два указателя, один указывает на начало исходного массива, а второй указывает на середину?

Или я должен malloc 2 новых слота памяти, скопировать соответствующие значения здесь и затем сохранить указатель на это пространство?

Ответы [ 5 ]

12 голосов
/ 17 февраля 2012

Я не думаю, что это плохая практика, если ты знаешь, что делаешь.В некоторых случаях вы жертвуете удобочитаемостью ради эффективности.Возможно, будет более понятно, если вы просто создадите еще два массива, но если вы твердо разбираетесь в массивах и указателях, зачем выделять дополнительную память?

11 голосов
/ 17 февраля 2012

Абсолютно нет! Весь смысл программирования на C состоит в том, чтобы делать эти аккуратные уловки с указателями!

Обратите внимание, однако, что сортировка слиянием не на месте, поэтому вам все равно придется выделять вспомогательный массив. Если вы делаете правильные трюки с указателями, вы можете просто использовать malloc один раз и повторно использовать его.

2 голосов
/ 17 февраля 2012

Обычно с помощью сортировки слиянием вы хотите поместить результат слияния в память, занятую исходным вводом. Если так, то вам следует:

  • сортировать обе половинки
  • скопируйте "нижнюю" половину вашего массива во вновь выделенный буфер, оставьте "верхнюю" половину там, где она
  • объединить из "верхней" половины и дополнительного буфера в "низ" большого массива.

Таким образом, вам нужно всего лишь выделить столько дополнительной памяти, сколько наполовину размера ввода. Вы даже можете сделать это один раз в начале и повторно использовать тот же буфер в качестве рабочего пространства для всех слияний, которые вы собираетесь делать.

2 голосов
/ 17 февраля 2012

В таком случае нормально использовать только один массив (например, сортировку слиянием).Вызывать malloc не нужно, если только размер массива не слишком велик для стека.

1 голос
/ 17 февраля 2012

Нет, это не плохо, и на самом деле я бы сказал, что это одна из единственных причин использования C в первую очередь.Если вы собираетесь делать бесполезные копии своих данных каждый раз, когда вам нужно обрабатывать одни и те же данные немного по-разному, вы уже вызвали одну из самых больших затрат на скриптовые языки высокого уровня.Вы также значительно увеличили объем обработки ошибок, который должен выполнять ваш код (поскольку выделение может быть неудачным), а поскольку обработка ошибок в C имеет тенденцию быть немного «многословной» (мягко говоря), чистая стоимость сложности намного хужечем небольшая сложность доступа к подмассиву на месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...