Доброго времени суток. Есть такая задача:
Сгенерировать массив и вывести его на экран. Сделать сортировку элементов: Шейкерный. Направление сортировки: по убыванию. Метод поиска: бинарный.
У меня есть следующий код:
#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");
}
Как его переделать под эти условия?
Чтобы сортировать по убыванию просто нужно поменять знак сравнения
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. и вместо постинкрементов всегда лучше использовать преинкремент, если это не помеха программе. В данном случаи у вас нет необходимости в использовании постинкрементов
Как уже ответили, достаточно изменить оператор сравнения.
От себя дополню, что функция 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");
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Существуют ли готовые алгоритмы по заполнению области сферами различных радиусов?
Здравствуйте, подскажите пожалуйста: почему в данной случае тип переменных i, j известен на этапе компиляции
Хотелось бы узнать как будут отличаться производные классы, если эти два выражения не идентичны? Или все таки они идентичны?
Несколько дней назад по необъяснимым мне пока причинам фоновая работа selenium'а (через Xvfb) стала сопровождаться автоматическим запуском экземпляра...