Простой C-подобный подход: нормализуйте flag
до 1
или 0
, а затем зафиксируйте его с результатом сравнения, чтобы перевернуть сравнение, только если установлено flag
.
for(j;j<size;++j)
{
key = arr[j];
i = j-1;
while(((arr[i]>key) ^ flag) && i >=0)
{
arr[i+1] = arr[i];
i = i-1;
}
arr[i+1]= key;
}
C ++ подход: шаблонизировать функцию на компараторе и вообще не использовать flag
;std::sort
делает это, предоставляя несколько API (один, который не принимает аргументов для компаратора и использует неявно operator<
, другой, который использует компаратор), но для начального удара вы можете потребовать, чтобы он пропустил один. Они обычно не должны писать свои собственные, они могут просто передать std::less<int>()
или std::greater<int>()
, и компилятор будет отвечать за генерацию специализированных версий вашего кода.
Шаблоны действительно означают, что компаратор должен быть известен во время компиляции, но даже если вам нужно решение во время выполнения, это может быть сделано без ручного написания кода дважды, просто протестируйте его flag
, а затем делегируйте вашей шаблонной функции, настроенной наstd::less<int>()
или std::greater<int>()
;да, это две копии кода в конечном двоичном файле, но, по крайней мере, вы не написали его и не должны поддерживать каждый из них независимо.