Метод сортировки “Шейкерный” (C++)

222
23 марта 2018, 12:54

Доброго времени суток. Есть такая задача:

Сгенерировать массив и вывести его на экран. Сделать сортировку элементов: Шейкерный. Направление сортировки: по убыванию. Метод поиска: бинарный.

У меня есть следующий код:

#include <iostream>
using namespace std;
//ф-ция для обмена значений ячеек
void swapEl(int *arr, int i)
{
int buff;
buff = arr[i];
arr[i] = arr[i - 1];
arr[i - 1] = buff;
}
//ф-ция "шейкер"-сортировки
void myShakerSort(int *arr, int size)
{
int leftMark = 1;
int rightMark = size - 1;
while (leftMark <= rightMark)
{
    for (int i = rightMark; i >= leftMark; i--)
        if (arr[i - 1] > arr[i]) swapEl(arr, i);
    leftMark++;

    for (int i = leftMark; i <= rightMark; i++)
        if (arr[i - 1] > arr[i]) swapEl(arr, i);
    rightMark--;
    cout << "\nИтерация: " << leftMark - 1; // просмотр количества итераций
}
}
int main()
{
setlocale(LC_ALL, "rus");
int size = 0;
cout << "Размер массива: ";
cin >> size;
int *A = new int[size];
for (int k = 0; k < size; k++)
{
    A[k] = size - k; // запись значений по убыванию
    cout << A[k] << " | ";
}
myShakerSort(A, size); // сортировка
cout << "\nМассив после сортировки:\n";
for (int k = 0; k < size; k++)
{
    cout << A[k] << " | ";
}
cout << endl;
system("PAUSE");
}

Как его переделать под эти условия?

Answer 1

Чтобы сортировать по убыванию просто нужно поменять знак сравнения

void myShakerSort(int *arr, int size)
{
    int leftMark = 1;
    int rightMark = size - 1;
    while (leftMark <= rightMark)
    {
        for (int i = rightMark; i >= leftMark; --i)
            if (arr[i - 1] < arr[i]) swapEl(arr, i);
        ++leftMark;

        for (int i = leftMark; i <= rightMark; ++i)
            if (arr[i - 1] < arr[i]) swapEl(arr, i);
        --rightMark;

    }
}

P.S. и вместо постинкрементов всегда лучше использовать преинкремент, если это не помеха программе. В данном случаи у вас нет необходимости в использовании постинкрементов

Answer 2

Как уже ответили, достаточно изменить оператор сравнения.

От себя дополню, что функция swapEl(...) не нужна, т.к. в стандартной библиотеке она уже реализована: http://www.cplusplus.com/reference/algorithm/swap/

Причем в стандарте С++11 работает через move-семантику.

В итоге весь код сводится к этому:

#include <iostream>
using namespace std;
//ф-ция "шейкер"-сортировки
void myShakerSort(int *arr, int size)
{
    int leftMark = 1;
    int rightMark = size - 1;
    while (leftMark <= rightMark)
    {
        for (int i = rightMark; i >= leftMark; i--)
            if (arr[i - 1] < arr[i]) 
                swap(arr[i], arr[i - 1]);
        leftMark++;

        for (int i = leftMark; i <= rightMark; i++)
            if (arr[i - 1] < arr[i]) 
                swap(arr[i], arr[i - 1]);
        rightMark--;
        cout << "\nИтерация: " << leftMark - 1; // просмотр количества итераций
    }
}
int main()
{
    setlocale(LC_ALL, "rus");
    int size = 0;
    cout << "Размер массива: ";
    cin >> size;
    int *A = new int[size];
    for (int k = 0; k < size; k++)
    {
        A[k] = size - k; // запись значений по убыванию
        cout << A[k] << " | ";
    }
    myShakerSort(A, size); // сортировка
    cout << "\nМассив после сортировки:\n";
    for (int k = 0; k < size; k++)
    {
        cout << A[k] << " | ";
    }
    cout << endl;
    system("PAUSE");
}
READ ALSO
Заполнение области сферами

Заполнение области сферами

Существуют ли готовые алгоритмы по заполнению области сферами различных радиусов?

161
Тип переменной во время компиляции или выполнения?

Тип переменной во время компиляции или выполнения?

Здравствуйте, подскажите пожалуйста: почему в данной случае тип переменных i, j известен на этапе компиляции

137
идентичность выражений

идентичность выражений

Хотелось бы узнать как будут отличаться производные классы, если эти два выражения не идентичны? Или все таки они идентичны?

198
Ошибка автоматического запуска chromedriver&#39;а

Ошибка автоматического запуска chromedriver'а

Несколько дней назад по необъяснимым мне пока причинам фоновая работа selenium'а (через Xvfb) стала сопровождаться автоматическим запуском экземпляра...

176