Как я могу объединить увеличивающиеся и уменьшающиеся функции сортировки в одну функцию, управляемую флагом vriable? - PullRequest
0 голосов
/ 24 октября 2019

Как гласит заголовок. У меня есть 2 функции. Один сортировать по возрастанию, а другой по убыванию. Я на С ++. Поэтому, чтобы объединить их, я сделал флаг переменной, как показано. Но я нахожу это просто дубликат кода. Любой эффективный способ, который вы, ребята, можете предложить .?

void insertionSort(int *arr , int size,int flag)
{
    int j = 1,key ,i;
    if(flag)
    {
        for(j;j<size;++j)
        {
            key = arr[j];
            i = j-1;
            while(arr[i]<key &&  i >=0)
            {
                arr[i+1] = arr[i];
                i = i-1;
            }
            arr[i+1]= key;
        }
    }
    else{
        for(j;j<size;++j)
        {
            key = arr[j];
            i = j-1;
            while(arr[i]>key &&  i >=0)
            {
                arr[i+1] = arr[i];
                i = i-1;
            }
            arr[i+1]= key;
        }
    }
   // return arr;
}```

1 Ответ

0 голосов
/ 24 октября 2019

Простой 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>();да, это две копии кода в конечном двоичном файле, но, по крайней мере, вы не написали его и не должны поддерживать каждый из них независимо.

...