когда тебе говорят, что код надо писать с оглядкой на то, как его можно будет использовать ещё где-нибудь — смело посылай такого дебила нахуй. это сраный архитектурный космонавт, который — обычно — вообще нихуя рабочего никогда не написал, а в худшем случае — родил уёбаного говномонстра, который «универсальная платформа для всего», огромная, неповоротливая и нихера не юзабельная нормальными людьми.
на самом деле эта хуйня гнездится в черепе от того, что большинство людей не умеют думать. каждый написаный ними кусок кода — это неебать какой подвиг. им легче оттяпать себе руку или ногу, нежели выкинуть код, который они с такими страданиями высрали. но даже они как-то там понимают, что задачи бывают разные; а код выкидывать нельзя, новый-то родить сложно. поэтому они пытаются высрать «универсальный код», который можно засунуть куда угодно. а в итоге получается гибрид ежа, ужа и стаместки: такой же красивый, полезный и удобный.
не бойся писать код «под задачу». и не бойся выкидывать написаное. на самом деле — выкидывай написаное как можно чаще. потому что старый код писал старый ты — и у этого старого тебя было меньше знаний и опыта. теперешний ты сделает то же самое красивее, лучше и быстрее (а если нет — то ты говно, убей себя немедленно). всё равно если ты не говно, то две трети старого кода ты в итоге перепишешь, а про оставшуюся треть постараешься не вспоминать никогда. только это займёт больше времени, потому что сначала ты попробуешь отделаться «малой болью и лёгкой косметикой» — вместо того, чтобы спокойно сделать заново, не стесняя себя протухшей хернёй.
а вот то, что выжило после нескольких переписываний в более-менее неизменном виде — то смело оформляй как библиотеку. пригодится. всё равно это будет типичный библиотечный код для типовых рутинных хуёвин. который код, конечно, можно взять уже готовый в интернетах — но какой смысл? при первой же ошибке в нём тебе придётся туда нырять, после чего ты захочешь его переписать, и… ну, дальше понятно. да, в итоге ты перепишешь даже libc — ну и что? всё равно libc говно. ну ладно, может, не перепишешь — но наделаешь враперов для удобства, я гарантирую это. потому что libc — говно.
вообще-то я хотел поиграться с проверкой столкновений. но нашёлся на винте древний такой polyengine на сишечке (не мой). ну, «он же работает», да: портанул на дишечку. это ничего, потому что код был не мой — можно спиздить целиком, а не переписывать. ну, обычно на это надеешься. конечно, треть уже переписал, треть готова к выкидыванию, а оставшаяяся треть ужасна.
p.s.: он не тормозит, это запись тормозит. потому что я забыл там параметры подкрутить.
когда нужно что‐то отсортировать, а либцшный qsort не нравится — обычно или ебошат какой‐нибудь сранопузырёк («а, потом переделаю!» ну да, ну да…), или примитивную реализацию того же квиксорта (иногда ещё и поломаную). а ведь есть отличный heapsort: простой как полено, стабильно O(n*log n) в худшем случае, не требует дополнительной памяти. чтобы было ясно, насколько оно простое, вот весь код:
void heapsort(alias lessfn, T) (T[] arr) {
auto count = arr.length;
if (count < 2) return; // nothing to do
void siftDown(T) (T start, T end) {
auto root = start;
for (;;) {
auto child = 2*root+1; // left child
if (child > end) break;
auto swap = root;
if (lessfn(arr.ptr[swap], arr.ptr[child])) swap = child;
if (child+1 <= end && lessfn(arr.ptr[swap], arr.ptr[child+1])) swap = child+1;
if (swap == root) break;
auto tmp = arr.ptr[swap];
arr.ptr[swap] = arr.ptr[root];
arr.ptr[root] = tmp;
root = swap;
}
}
auto end = count-1;
// heapify
auto start = (end-1)/2; // parent; always safe, as our array has at least two items
for (;;) {
siftDown(start, end);
if (start-- == 0) break; // as `start` cannot be negative, use this condition
}
while (end > 0) {
{
auto tmp = arr.ptr[0];
arr.ptr[0] = arr.ptr[end];
arr.ptr[end] = tmp;
}
--end;
siftDown(0, end);
}
}
нет никакой причины его не использовать, когда надо по какой‐то причине притащить доморощеную сортировку. ну, разве если вам нужен stable sort: хип не stable. зато не имеет патологических случаев — в отличие от quick.
p.s.: тут анонимус уточняет, что quick тоже не stable. я, вроде, не говорил, что он stable, но как-то из текста оно подразумевалось. был неправ. отстрадаю. отсижу.